summaryrefslogtreecommitdiff
path: root/modules/programs/vim.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/programs/vim.nix')
-rw-r--r--modules/programs/vim.nix111
1 files changed, 111 insertions, 0 deletions
diff --git a/modules/programs/vim.nix b/modules/programs/vim.nix
new file mode 100644
index 0000000..115fa0f
--- /dev/null
+++ b/modules/programs/vim.nix
@@ -0,0 +1,111 @@
+{ 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.pluginDictionaries = cfg.plugins;
+ };
+
+ text = import ../system/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.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
+ nnoremap // :nohlsearch<CR>
+
+ set nowrap
+ set number
+
+ set list
+ set listchars=tab:»·,trail:·,extends:⟩,precedes:⟨
+ set fillchars+=vert:\ ,stl:\ ,stlnc:\
+
+ set lazyredraw
+ '';
+
+ };
+}