{
  # Empty configuration
  empty = {
    plugins.packer.enable = true;
  };

  test = {
    plugins.packer = {
      enable = true;

      plugins = [
        # Packer can manage itself
        "wbthomason/packer.nvim"

        # Simple plugins can be specified as strings
        "rstacruz/vim-closer"

        # Lazy loading:
        # Load on specific commands
        {
          name = "tpope/vim-dispatch";
          opt = true;
          cmd = [
            "Dispatch"
            "Make"
            "Focus"
            "Start"
          ];
        }

        # Load on an autocommand event
        {
          name = "andymass/vim-matchup";
          event = "VimEnter";
        }

        # Load on a combination of conditions: specific filetypes or commands
        # Also run code after load (see the "config" key)
        {
          name = "w0rp/ale";
          ft = [
            "sh"
            "zsh"
            "bash"
            "c"
            "cpp"
            "cmake"
            "html"
            "markdown"
            "racket"
            "vim"
            "tex"
          ];
          cmd = "ALEEnable";
          config = "vim.cmd[[ALEEnable]]";
        }

        # Plugins can have dependencies on other plugins
        {
          name = "haorenW1025/completion-nvim";
          opt = true;
          requires = [
            {
              name = "hrsh7th/vim-vsnip";
              opt = true;
            }
            {
              name = "hrsh7th/vim-vsnip-integ";
              opt = true;
            }
          ];
        }

        # Plugins can also depend on rocks from luarocks.org:
        {
          name = "my/supercoolplugin";
          rocks = [
            "lpeg"
            {
              name = "lua-cjson";
              version = "2.1.0";
            }
          ];
        }

        # Local plugins can be included
        "~/projects/personal/hover.nvim"

        # Plugins can have post-install/update hooks
        {
          name = "iamcco/markdown-preview.nvim";
          run = "cd app && yarn install";
          cmd = "MarkdownPreview";
        }

        # Post-install/update hook with neovim command
        {
          name = "nvim-treesitter/nvim-treesitter";
          run = ":TSUpdate";
        }

        # Post-install/update hook with call of vimscript function with argument
        {
          name = "glacambre/firenvim";
          run.__raw = ''function() vim.fn["firenvim#install"](0) end'';
        }

        # Use specific branch, dependency and run lua file after load
        {
          name = "glepnir/galaxyline.nvim";
          branch = "main";
          config.__raw = ''function() require"statusline" end'';
          requires = [ "kyazdani42/nvim-web-devicons" ];
        }

        # Use dependency and run lua function after load
        {
          name = "lewis6991/gitsigns.nvim";
          requires = [ "nvim-lua/plenary.nvim" ];
          config.__raw = ''function() require("gitsigns").setup() end'';
        }

        # You can alias plugin names
        {
          name = "dracula/vim";
          as = "dracula";
        }
      ];

      # You can specify rocks in isolation
      rockPlugins = [
        "penlight"
        "lua-resty-http"
        "lpeg"
      ];
    };
  };

  no-packages = {
    plugins.packer = {
      enable = true;
      gitPackage = null;
    };
  };
}
