diff --git a/modules/core/build/default.nix b/modules/core/build/default.nix index bbd634ce..86239b90 100644 --- a/modules/core/build/default.nix +++ b/modules/core/build/default.nix @@ -1,5 +1,6 @@ { config, + pkgs, lib, ... }: let @@ -90,6 +91,14 @@ in { options = { vim = { + package = mkOption { + type = types.package; + default = pkgs.neovim-unwrapped; + description = '' + The neovim package to use. You will need to use an unwrapped package for this option to work as intended. + ''; + }; + viAlias = mkOption { description = "Enable vi alias"; type = types.bool; diff --git a/modules/modules.nix b/modules/modules.nix index 55f2c016..dc38621b 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -3,9 +3,12 @@ lib, check ? true, }: let - inherit (lib) mkDefault; + inherit (builtins) map; + inherit (lib.modules) mkDefault; + inherit (lib.lists) concatLists; - plugins = builtins.map (p: ./plugins + "/${p}") [ + # map each plugin from our plugins module into a list + plugins = map (p: ./plugins + "/${p}") [ "completion" "theme" "statusline" @@ -32,14 +35,16 @@ "debugger" ]; - core = builtins.map (p: ./core + "/${p}") [ + core = map (p: ./core + "/${p}") [ "build" "mappings" "warnings" ]; - modules = [ - ./neovim + neovim = map (p: ./neovim + "/${p}") [ + "basic" + "maps" + "spellcheck" ]; pkgsModule = {config, ...}: { @@ -54,5 +59,7 @@ }; }; }; + + modules = concatLists [core neovim plugins] ++ [pkgsModule]; in - [pkgsModule] ++ (lib.concatLists [core modules plugins]) + modules diff --git a/modules/neovim/basic/default.nix b/modules/neovim/basic/default.nix new file mode 100644 index 00000000..e8ffafe7 --- /dev/null +++ b/modules/neovim/basic/default.nix @@ -0,0 +1,134 @@ +{ + lib, + config, + ... +}: let + inherit (lib) optionalString nvim; + + cfg = config.vim; +in { + imports = [./options.nix]; + config = { + vim = { + configRC.basic = nvim.dag.entryAfter ["globalsScript"] '' + " Settings that are set for everything + set encoding=utf-8 + set mouse=${cfg.mouseSupport} + set tabstop=${toString cfg.tabWidth} + set shiftwidth=${toString cfg.tabWidth} + set softtabstop=${toString cfg.tabWidth} + set expandtab + set cmdheight=${toString cfg.cmdHeight} + set updatetime=${toString cfg.updateTime} + set shortmess+=c + set tm=${toString cfg.mapTimeout} + set hidden + set cursorlineopt=${toString cfg.cursorlineOpt} + set scrolloff=${toString cfg.scrollOffset} + + ${optionalString cfg.debugMode.enable '' + " Debug mode settings + set verbose=${toString cfg.debugMode.level} + set verbosefile=${cfg.debugMode.logFile} + ''} + + ${optionalString cfg.splitBelow '' + set splitbelow + ''} + + ${optionalString cfg.splitRight '' + set splitright + ''} + + ${optionalString cfg.showSignColumn '' + set signcolumn=yes + ''} + + ${optionalString cfg.autoIndent '' + set autoindent + ''} + + ${optionalString cfg.preventJunkFiles '' + set noswapfile + set nobackup + set nowritebackup + ''} + + ${optionalString (cfg.bell == "none") '' + set noerrorbells + set novisualbell + ''} + + ${optionalString (cfg.bell == "on") '' + set novisualbell + ''} + + ${optionalString (cfg.bell == "visual") '' + set noerrorbells + ''} + + ${optionalString (cfg.lineNumberMode == "relative") '' + set relativenumber + ''} + + ${optionalString (cfg.lineNumberMode == "number") '' + set number + ''} + + ${optionalString (cfg.lineNumberMode == "relNumber") '' + set number relativenumber + ''} + + ${optionalString cfg.useSystemClipboard '' + set clipboard+=unnamedplus + ''} + + ${optionalString cfg.mapLeaderSpace '' + let mapleader=" " + let maplocalleader=" " + ''} + + ${optionalString cfg.syntaxHighlighting '' + syntax on + ''} + + ${optionalString (!cfg.wordWrap) '' + set nowrap + ''} + + ${optionalString cfg.hideSearchHighlight '' + set nohlsearch + set incsearch + ''} + + ${optionalString cfg.colourTerm '' + set termguicolors + set t_Co=256 + ''} + + ${optionalString (!cfg.enableEditorconfig) '' + let g:editorconfig = v:false + ''} + + ${optionalString (cfg.leaderKey != null) '' + let mapleader = "${toString cfg.leaderKey}" + ''} + + ${optionalString (cfg.searchCase == "ignore") '' + set nosmartcase + set ignorecase + ''} + + ${optionalString (cfg.searchCase == "smart") '' + set smartcase + set ignorecase + ''} + + ${optionalString (cfg.searchCase == "sensitive") '' + set nosmartcase + set noignorecase + ''} + ''; + }; + }; +} diff --git a/modules/neovim/module.nix b/modules/neovim/basic/options.nix similarity index 87% rename from modules/neovim/module.nix rename to modules/neovim/basic/options.nix index 4a2750fc..450e5836 100644 --- a/modules/neovim/module.nix +++ b/modules/neovim/basic/options.nix @@ -7,14 +7,6 @@ inherit (lib.types) types; in { options.vim = { - package = mkOption { - type = types.package; - default = pkgs.neovim-unwrapped; - description = '' - The neovim package to use. You will need to use an unwrapped package for this option to work as intended. - ''; - }; - debugMode = { enable = mkEnableOption "debug mode"; level = mkOption { @@ -38,17 +30,6 @@ in { description = "The leader key to be used internally"; }; - spellChecking = { - enable = mkEnableOption "neovim's built-in spellchecking"; - enableProgrammingWordList = mkEnableOption "vim-dirtytalk, a wordlist for programmers, that includes programming words"; - languages = mkOption { - type = with types; listOf str; - description = "The languages to be used for spellchecking"; - default = ["en"]; - example = ["en" "de"]; - }; - }; - colourTerm = mkOption { type = types.bool; default = true; @@ -179,6 +160,7 @@ in { default = true; description = "New splits will open to the right"; }; + enableEditorconfig = mkOption { type = types.bool; default = true; diff --git a/modules/neovim/config.nix b/modules/neovim/config.nix deleted file mode 100644 index 1a3e97bd..00000000 --- a/modules/neovim/config.nix +++ /dev/null @@ -1,185 +0,0 @@ -{ - lib, - config, - ... -}: let - inherit (builtins) concatStringsSep; - inherit (lib) optionalString mkIf nvim; - - cfg = config.vim; -in { - config = { - vim.startPlugins = ["plenary-nvim"] ++ lib.optionals (cfg.spellChecking.enableProgrammingWordList) ["vim-dirtytalk"]; - - vim.maps.normal = - mkIf cfg.disableArrows { - "" = { - action = ""; - - noremap = false; - }; - "" = { - action = ""; - - noremap = false; - }; - "" = { - action = ""; - noremap = false; - }; - "" = { - action = ""; - noremap = false; - }; - } - // mkIf cfg.mapLeaderSpace { - "" = { - action = ""; - }; - }; - - vim.maps.insert = mkIf cfg.disableArrows { - "" = { - action = ""; - noremap = false; - }; - "" = { - action = ""; - noremap = false; - }; - "" = { - action = ""; - noremap = false; - }; - "" = { - action = ""; - noremap = false; - }; - }; - - vim.configRC.basic = nvim.dag.entryAfter ["globalsScript"] '' - " Settings that are set for everything - set encoding=utf-8 - set mouse=${cfg.mouseSupport} - set tabstop=${toString cfg.tabWidth} - set shiftwidth=${toString cfg.tabWidth} - set softtabstop=${toString cfg.tabWidth} - set expandtab - set cmdheight=${toString cfg.cmdHeight} - set updatetime=${toString cfg.updateTime} - set shortmess+=c - set tm=${toString cfg.mapTimeout} - set hidden - set cursorlineopt=${toString cfg.cursorlineOpt} - set scrolloff=${toString cfg.scrollOffset} - - ${optionalString cfg.debugMode.enable '' - " Debug mode settings - set verbose=${toString cfg.debugMode.level} - set verbosefile=${cfg.debugMode.logFile} - ''} - - ${optionalString cfg.splitBelow '' - set splitbelow - ''} - - ${optionalString cfg.splitRight '' - set splitright - ''} - - ${optionalString cfg.showSignColumn '' - set signcolumn=yes - ''} - - ${optionalString cfg.autoIndent '' - set autoindent - ''} - - ${optionalString cfg.preventJunkFiles '' - set noswapfile - set nobackup - set nowritebackup - ''} - - ${optionalString (cfg.bell == "none") '' - set noerrorbells - set novisualbell - ''} - - ${optionalString (cfg.bell == "on") '' - set novisualbell - ''} - - ${optionalString (cfg.bell == "visual") '' - set noerrorbells - ''} - - ${optionalString (cfg.lineNumberMode == "relative") '' - set relativenumber - ''} - - ${optionalString (cfg.lineNumberMode == "number") '' - set number - ''} - - ${optionalString (cfg.lineNumberMode == "relNumber") '' - set number relativenumber - ''} - - ${optionalString cfg.useSystemClipboard '' - set clipboard+=unnamedplus - ''} - - ${optionalString cfg.mapLeaderSpace '' - let mapleader=" " - let maplocalleader=" " - ''} - - ${optionalString cfg.syntaxHighlighting '' - syntax on - ''} - - ${optionalString (!cfg.wordWrap) '' - set nowrap - ''} - - ${optionalString cfg.hideSearchHighlight '' - set nohlsearch - set incsearch - ''} - - ${optionalString cfg.colourTerm '' - set termguicolors - set t_Co=256 - ''} - - ${optionalString (!cfg.enableEditorconfig) '' - let g:editorconfig = v:false - ''} - - ${optionalString cfg.spellChecking.enable '' - set spell - set spelllang=${concatStringsSep "," cfg.spellChecking.languages}${optionalString cfg.spellChecking.enableProgrammingWordList ",programming"} - ''} - - ${optionalString (cfg.leaderKey != null) '' - let mapleader = "${toString cfg.leaderKey}" - ''} - - ${optionalString (cfg.searchCase == "ignore") '' - set nosmartcase - set ignorecase - ''} - - ${optionalString (cfg.searchCase == "smart") '' - set smartcase - set ignorecase - ''} - - ${optionalString (cfg.searchCase == "sensitive") '' - set nosmartcase - set noignorecase - ''} - ''; - }; -} diff --git a/modules/neovim/default.nix b/modules/neovim/default.nix index a8839398..5de3773f 100644 --- a/modules/neovim/default.nix +++ b/modules/neovim/default.nix @@ -1,4 +1,3 @@ -_: { imports = [ ./config.nix ./module.nix diff --git a/modules/neovim/maps/default.nix b/modules/neovim/maps/default.nix new file mode 100644 index 00000000..7a27eb33 --- /dev/null +++ b/modules/neovim/maps/default.nix @@ -0,0 +1,61 @@ +{ + config, + lib, + ... +}: let + inherit (lib) mkIf; + + cfg = config.vim; +in { + config = { + vim.maps = { + # normal mode mappings + normal = + mkIf cfg.disableArrows { + "" = { + action = ""; + + noremap = false; + }; + "" = { + action = ""; + + noremap = false; + }; + "" = { + action = ""; + noremap = false; + }; + "" = { + action = ""; + noremap = false; + }; + } + // mkIf cfg.mapLeaderSpace { + "" = { + action = ""; + }; + }; + + # insert mode mappings + insert = mkIf cfg.disableArrows { + "" = { + action = ""; + noremap = false; + }; + "" = { + action = ""; + noremap = false; + }; + "" = { + action = ""; + noremap = false; + }; + "" = { + action = ""; + noremap = false; + }; + }; + }; + }; +} diff --git a/modules/neovim/spellcheck/default.nix b/modules/neovim/spellcheck/default.nix new file mode 100644 index 00000000..8ea513db --- /dev/null +++ b/modules/neovim/spellcheck/default.nix @@ -0,0 +1,23 @@ +{ + lib, + config, + ... +}: let + inherit (builtins) concatStringsSep; + inherit (lib) optionalString optionals mkIf nvim; + + cfg = config.vim; +in { + imports = [./options.nix]; + config = mkIf cfg.spellChecking.enable { + vim = { + startPlugins = optionals cfg.spellChecking.enableProgrammingWordList ["vim-dirtytalk"]; + configRC.spellcheck = nvim.dag.entryAfter ["basic"] '' + ${optionalString cfg.spellChecking.enable '' + set spell + set spelllang=${concatStringsSep "," cfg.spellChecking.languages}${optionalString cfg.spellChecking.enableProgrammingWordList ",programming"} + ''} + ''; + }; + }; +} diff --git a/modules/neovim/spellcheck/options.nix b/modules/neovim/spellcheck/options.nix new file mode 100644 index 00000000..2017d8b3 --- /dev/null +++ b/modules/neovim/spellcheck/options.nix @@ -0,0 +1,17 @@ +{lib, ...}: let + inherit (lib) mkEnableOption mkOption; + inherit (lib.types) types; +in { + options.vim = { + spellChecking = { + enable = mkEnableOption "neovim's built-in spellchecking"; + enableProgrammingWordList = mkEnableOption "vim-dirtytalk, a wordlist for programmers, that includes programming words"; + languages = mkOption { + type = with types; listOf str; + description = "The languages to be used for spellchecking"; + default = ["en"]; + example = ["en" "de"]; + }; + }; + }; +}