{
  pkgs,
  outputs,
  ...
}:

{
  nixpkgs = {
    overlays = with outputs.overlays; [ nvim-plugins ];
  };

  home-manager.users.kalle.programs.neovim =
    let
      toLua = str: "lua << EOF\n${str}\nEOF\n";
      toLuaFile = file: "lua << EOF\n${builtins.readFile file}\nEOF\n";
    in
    {
      enable = true;

      viAlias = true;
      vimAlias = true;
      vimdiffAlias = true;

      extraPackages = with pkgs; [
        ripgrep # Required for telescope
        wl-clipboard # Required for clipboard sync

        # Language servers
        clang-tools
        lua-language-server
        nodePackages.typescript-language-server
        nodePackages."@astrojs/language-server"
        typescript
        tailwindcss-language-server
        gopls
        vhdl-ls
        nixd
        nixfmt-rfc-style
      ];

      plugins = with pkgs.vimPlugins; [
        yuck-vim

        {
          plugin = which-key-nvim;
          config = toLua "require('which-key').setup()";
        }

        neodev-nvim
        plenary-nvim

        {
          plugin = telescope-nvim;
          config = toLuaFile ./plugin/telescope.lua;
        }
        telescope-ui-select-nvim

        FTerm-nvim

        vim-fugitive

        harpoon1

        {
          plugin = undotree-nvim;
          config = toLua "require('undotree').setup()";
        }

        {
          plugin = comment-nvim;
          config = toLua "require('Comment').setup()";
        }
        {
          plugin = todo-comments-nvim;
          config = toLua "require('todo-comments').setup()";
        }

        {
          plugin = neoconf-nvim;
          config = toLua "require('neoconf').setup()";
        }
        {
          plugin = catppuccin-nvim;
          config = "colorscheme catppuccin-mocha";
        }

        {
          plugin = oil-nvim;
          config = toLua "require('oil').setup()";
        }

        cmp-nvim-lsp
        cmp-nvim-lsp-signature-help
        cmp-buffer
        cmp-path
        cmp-cmdline
        cmp-git
        cmp-calc
        cmp_luasnip
        luasnip
        friendly-snippets
        {
          plugin = nvim-cmp;
          config = toLuaFile ./plugin/cmp.lua;
        }

        {
          plugin = nvim-lspconfig;
          config = toLuaFile ./plugin/lsp.lua;
        }
        rust-tools-nvim
        {
          plugin = fidget-nvim;
          config = toLua "require('fidget').setup({})";
        }

        rainbow-delimiters-nvim

        {
          plugin = (nvim-treesitter.withAllGrammars);
          config = toLuaFile ./plugin/treesitter.lua;
        }
      ];

      extraLuaConfig = ''
        ${builtins.readFile ./options.lua}
        ${builtins.readFile ./keymaps.lua}
      '';

    };
}