{ config, pkgs, lib, ... }: let inherit (lib) getName mkIf optional; # inherit (config.lib.file) mkOutOfStoreSymlink; nixConfigDir = "${config.home.homeDirectory}/dotfiles.nix"; nvr = "${pkgs.neovim-remote}/bin/nvr"; pluginWithDeps = plugin: deps: plugin.overrideAttrs (_: { dependencies = deps; }); nonVSCodePlugin = plugin: { plugin = plugin; optional = true; config = ''if !exists('g:vscode') | packadd ${plugin.pname} | endif''; }; in { # Neovim # https://rycee.gitlab.io/home-manager/options.html#opt-programs.neovim.enable programs.neovim = { enable = true; viAlias = true; vimAlias = true; vimdiffAlias = true; }; # Config and plugins ------------------------------------------------------------------------- {{{ # Minimal init.vim config to load Lua config. Nix and Home Manager don't currently support # `init.lua`. # xdg.configFile."nvim/lua".source = mkOutOfStoreSymlink "${nixConfigDir}/configs/nvim/lua"; # xdg.configFile."nvim/colors".source = mkOutOfStoreSymlink "${nixConfigDir}/configs/nvim/colors"; # programs.neovim.extraConfig = "lua require('init')"; programs.neovim.plugins = with pkgs.vimPlugins; [ tabular vim-commentary vim-surround ] ++ map (p: { plugin = p; optional = true; }) [ which-key-nvim zoomwintab-vim ] ++ map nonVSCodePlugin [ direnv-vim vim-fugitive ]; # }}} # Shell related ------------------------------------------------------------------------------ {{{ # From personal addon module `./modules/programs/neovim/extras.nix` programs.neovim.extras.termBufferAutoChangeDir = true; programs.neovim.extras.nvrAliases.enable = true; programs.fish.functions.set-nvim-background = mkIf config.programs.neovim.enable { # See `./shells.nix` for more on how this is used. body = '' # Set `background` of all running Neovim instances base on `$term_background`. for server in (${nvr} --serverlist) ${nvr} -s --nostart --servername $server -c "set background=$term_background" & end ''; onVariable = "term_background"; }; programs.fish.interactiveShellInit = mkIf config.programs.neovim.enable '' # Run Neovim related functions on init for their effects, and to register them so they are # triggered when the relevant event happens or variable changes. set-nvim-background ''; # }}} # Required packages -------------------------------------------------------------------------- {{{ programs.neovim.extraPackages = with pkgs; [ neovim-remote gcc # needed for nvim-treesitter tree-sitter # needed for nvim-treesitter # Language servers # See `../configs/nvim/lua/init.lua` for configuration. # ccls nodePackages.bash-language-server # nodePackages.typescript-language-server nodePackages.vim-language-server nodePackages.vscode-langservers-extracted nodePackages.yaml-language-server rnix-lsp ] ++ optional (pkgs.stdenv.system != "x86_64-darwin") sumneko-lua-language-server; # }}} }