{ 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"; };
  programs.zsh.sessionVariables = { EDITOR = "vim"; };
  systemd.user.sessionVariables = { EDITOR = "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.buildVimPluginFrom2Nix rec {
          pname = "vim-tada";
          version = "2022-04-22";
          src = fetchFromGitHub {
            owner = "dewyze";
            repo = pname;
            rev = "acfda7229fc487ee6da44650164cb770d1cc608c";
            sha256 = "sha256-9kvLbzrVjtBTjbXmhJ7JTggXgFvGVF7sc2YiVW9fUGY=";
          };
        })
        (vimUtils.buildVimPluginFrom2Nix 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
    '';
  };
}