{
  config,
  pkgs,
  lib,
  inputs,
  system,
  ...
}: let
  unstablePackages = inputs.nixpkgs-nixos-unstable.legacyPackages."${system}";
  nil = inputs.nil.packages."${system}".default;
  cocPackage = unstablePackages.vimPlugins.coc-nvim;
  nvimPackage = unstablePackages.neovim-unwrapped;
in {
  home.file.".vimrc".source = ../../.vimrc;
  home.packages = with pkgs; [ripgrep];
  home.sessionVariables = {
    EDITOR = "vim";
    VISUAL = "vim";
  };
  programs.zsh.sessionVariables = {
    EDITOR = "vim";
    VISUAL = "vim";
  };
  systemd.user.sessionVariables = {
    EDITOR = "vim";
    VISUAL = "vim";
  };

  programs.neovim = {
    enable = true;
    package = nvimPackage;
    coc = {
      enable = true;
      package = cocPackage;
      settings = {
        "suggest.noselect" = false;
        "suggest.enablePreselect" = true;
        "suggest.fixInsertedWord" = true;
        "suggest.removeDuplicateItems" = true;
        "suggest.virtualText" = true;
        languageserver = {
          nix = {
            command = "${nil}/bin/nil";
            rootPatterns = ["flake.nix"];
            filetypes = ["nix"];
          };
        };
      };
    };
    viAlias = true;
    vimAlias = true;
    vimdiffAlias = true;
    withNodeJs = true;
    withPython3 = true;
    withRuby = true;

    plugins = with pkgs;
    with pkgs.vimPlugins; [
      (vimUtils.buildVimPlugin rec {
        pname = "vim-tada";
        version = "2022-04-22";
        src = fetchFromGitHub {
          owner = "dewyze";
          repo = pname;
          rev = "acfda7229fc487ee6da44650164cb770d1cc608c";
          sha256 = "sha256-9kvLbzrVjtBTjbXmhJ7JTggXgFvGVF7sc2YiVW9fUGY=";
        };
      })
      (vimUtils.buildVimPlugin rec {
        pname = "srht.vim";
        version = "2022-01-04";
        src = fetchFromSourcehut {
          owner = "~willdurand";
          repo = pname;
          rev = "825e685f75464cbd41a5f8eded974e46f416355e";
          sha256 = "sha256-9/Yeqmq/1ZIIsEgsrLLZ7o0cjOt/wlUgeLEzJoK7eco=";
        };
      })
      ack-vim
      coc-go
      coc-highlight
      coc-rust-analyzer
      coc-yaml
      committia-vim
      ctrlp-vim
      editorconfig-vim
      fzf-vim
      lsp-colors-nvim
      nvim-tree-lua
      nvim-web-devicons
      quickfix-reflector-vim
      rainbow
      tabular
      vim-airline
      vim-airline-themes
      vim-autoformat
      vim-colors-solarized
      vim-devicons
      vim-dirdiff
      vim-dispatch
      vim-fugitive
      vim-gitgutter
      vim-markdown
      vim-nix
      vim-sensible
      vim-startify
      vim-surround
      vim-toml
    ];
    extraConfig = ''
      if filereadable($HOME . "/.vimrc")
      source $HOME/.vimrc
      endif
    '';
  };
}
