{ config, lib, pkgs, ... }: with lib; let cfg = config.programs.vim; vim = pkgs.vim_configurable.customize { name = "vim"; vimrcConfig.customRC = config.environment.etc."vimrc".text; vimrcConfig.vam = { knownPlugins = pkgs.vimPlugins // cfg.extraKnownPlugins; pluginDictionaries = cfg.plugins; }; }; text = import ../lib/write-text.nix { inherit lib; mkTextDerivation = name: text: pkgs.writeText "vim-options-${name}" text; }; vimOptions = concatMapStringsSep "\n" (attr: attr.text) (attrValues cfg.vimOptions); in { options = { programs.vim.enable = mkOption { type = types.bool; default = false; description = '' Whether to configure vim. ''; }; programs.vim.enableSensible = mkOption { type = types.bool; default = false; example = true; description = '' Enable sensible configuration options for vim. ''; }; programs.vim.extraKnownPlugins = mkOption { type = types.attrsOf types.package; default = {}; example = literalExample '' { vim-jsx = pkgs.vimUtils.buildVimPluginFrom2Nix { name = "vim-javascript-2016-07-29"; src = pkgs.fetchgit { url = "git://github.com/mxw/vim-jsx"; rev = "261114c925ea81eeb4db1651cc1edced66d6b5d6"; sha256 = "17pffzwnvsimnnr4ql1qifdh4a0sqqsmcwfiqqzgglvsnzw5vpls"; }; dependencies = []; }; } ''; description = '' Custom plugin declarations to add to VAM's knownPlugins. ''; }; programs.vim.plugins = mkOption { type = types.listOf types.attrs; default = []; example = [ { names = [ "surround" "vim-nix" ]; } ]; description = '' VAM plugin dictionaries to use for vim_configurable. ''; }; programs.vim.vimOptions = mkOption { internal = true; type = types.attrsOf (types.submodule text); default = {}; }; programs.vim.vimConfig = mkOption { type = types.lines; default = ""; description = '' Extra vimrcConfig to use for vim_configurable. ''; }; }; config = mkIf cfg.enable { environment.systemPackages = [ # Include vim_configurable package. vim ]; environment.variables.EDITOR = "${vim}/bin/vim"; environment.etc."vimrc".text = '' ${vimOptions} ${cfg.vimConfig} if filereadable('/etc/vimrc.local') source /etc/vimrc.local endif ''; programs.vim.plugins = mkIf cfg.enableSensible [ { names = [ "fugitive" "surround" "vim-nix" ]; } ]; programs.vim.vimOptions.sensible.text = mkIf cfg.enableSensible '' set nocompatible filetype plugin indent on syntax on set et sw=2 ts=2 set bs=indent,start set hlsearch set incsearch nnoremap // :nohlsearch set list set listchars=tab:»·,trail:·,extends:⟩,precedes:⟨ set fillchars+=vert:\ ,stl:\ ,stlnc:\ set number set lazyredraw set nowrap set showcmd set showmatch ''; }; }