{ config, pkgs, ... }:
{
  programs.neovim = {
    enable = true;
    defaultEditor = true;
    viAlias = true;
    vimAlias = true;
    plugins = with pkgs.vimPlugins; [
      # Vim theme
      vim-airline
      vim-airline-themes

      # Internal clipboard
      cmp-vsnip
      vim-vsnip

      # Autocomplete manager
      lspkind-nvim

      # Autocomplete plugins
      cmp-buffer
      cmp-cmdline
      cmp-nvim-lsp
      cmp-path
      nvim-cmp

      # Hex color visualizer and color theme
      nvim-colorizer-lua
      vim-monokai-pro

      # Discord RPC
      vimsence

      # Misc languages
      kdl-vim
      vim-markdown
      vim-nix
    ];
    extraConfig = ''
      lua <<EOF
        -- Set up nvim-cmp
        local cmp = require'cmp'

        cmp.setup({
          snippet = {
            -- Specify a snippet engine
            expand = function(args)
              vim.fn["vsnip#anonymous"](args.body)
            end,
          },
          mapping = cmp.mapping.preset.insert({
            ['<C-b>'] = cmp.mapping.scroll_docs(-4),
            ['<C-f>'] = cmp.mapping.scroll_docs(4),
            ['<C-Space>'] = cmp.mapping.complete(),
            ['<C-e>'] = cmp.mapping.abort(),
            ['<CR>'] = cmp.mapping.confirm({ select = true }),
          }),
          sources = cmp.config.sources(
            {
              { name = 'nvim_lsp' },
              { name = 'vsnip' }
            },
            {
              { name = 'buffer' }
            }
          )
        })

        -- Use buffer source for '/' and '?'
        cmp.setup.cmdline({ '/', '?' }, {
          mapping = cmp.mapping.preset.cmdline(),
          sources = {
            { name = 'buffer' }
          }
        })

        -- Use cmdline & path source for ':'
        cmp.setup.cmdline(':', {
          mapping = cmp.mapping.preset.cmdline(),
          sources = cmp.config.sources(
            {
              { name = 'path' }
            },
            {
              { name = 'cmdline' }
            }
          )
        })
      EOF

      colorscheme monokai_pro
      let g:airline_theme='onedark'
      let g:airline#extensions#tabline#enabled = 1
      hi Normal guibg=none
      hi Visual guibg=#${config.look.colors.mid}
      hi Pmenu guibg=#${config.look.colors.mid}
      hi EndOfBuffer guibg=none
      hi LineNr guibg=none
      lua require'colorizer'.setup()

      set nu rnu
      set termguicolors
      set mouse=a

      set undofile
      set undodir=$HOME/.local/share/nvim/undo
      set undolevels=100
      set undoreload=10000

      nmap <C-x> :bnext<CR>
      nmap <C-z> :bprev<CR>
      nmap <C-w> :bd<CR>
    '';
  };

  home = {
    sessionVariables.MANPAGER = "nvim +Man!";
    persistence."/persist${config.home.homeDirectory}".directories = [ ".local/share/nvim/undo" ];
  };
}
