programs.neovim: init (#98506)
* programs.neovim: init Allows to build a proper runtime folder with after/ ftplugin/ parser/ subfolders etc. (neo)vim expects a few different folders, for instance to load treesitter parsers. This PR reuses the builder from the etc module, notwithstanding the different modes/uid/gid. This allows to get rid of some autocmd in customRC (via proper use of the folder hierarchy) which is a win in my opinion.wip/yesman
parent
6bb6779b8e
commit
1e510a65a3
@ -0,0 +1,165 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.programs.neovim; |
||||
|
||||
runtime' = filter (f: f.enable) (attrValues cfg.runtime); |
||||
|
||||
# taken from the etc module |
||||
runtime = pkgs.stdenvNoCC.mkDerivation { |
||||
name = "runtime"; |
||||
|
||||
builder = ../system/etc/make-etc.sh; |
||||
|
||||
preferLocalBuild = true; |
||||
allowSubstitutes = false; |
||||
|
||||
sources = map (x: x.source) runtime'; |
||||
targets = map (x: x.target) runtime'; |
||||
}; |
||||
|
||||
in { |
||||
options.programs.neovim = { |
||||
enable = mkEnableOption "Neovim"; |
||||
|
||||
defaultEditor = mkOption { |
||||
type = types.bool; |
||||
default = false; |
||||
description = '' |
||||
When enabled, installs neovim and configures neovim to be the default editor |
||||
using the EDITOR environment variable. |
||||
''; |
||||
}; |
||||
|
||||
viAlias = mkOption { |
||||
type = types.bool; |
||||
default = false; |
||||
description = '' |
||||
Symlink <command>vi</command> to <command>nvim</command> binary. |
||||
''; |
||||
}; |
||||
|
||||
vimAlias = mkOption { |
||||
type = types.bool; |
||||
default = false; |
||||
description = '' |
||||
Symlink <command>vim</command> to <command>nvim</command> binary. |
||||
''; |
||||
}; |
||||
|
||||
withRuby = mkOption { |
||||
type = types.bool; |
||||
default = true; |
||||
description = "Enable ruby provider."; |
||||
}; |
||||
|
||||
configure = mkOption { |
||||
type = types.attrs; |
||||
default = {}; |
||||
example = literalExample '' |
||||
configure = { |
||||
customRC = $'''' |
||||
" here your custom configuration goes! |
||||
$''''; |
||||
packages.myVimPackage = with pkgs.vimPlugins; { |
||||
# loaded on launch |
||||
start = [ fugitive ]; |
||||
# manually loadable by calling `:packadd $plugin-name` |
||||
opt = [ ]; |
||||
}; |
||||
}; |
||||
''; |
||||
description = '' |
||||
Generate your init file from your list of plugins and custom commands. |
||||
Neovim will then be wrapped to load <command>nvim -u /nix/store/<hash>-vimrc</command> |
||||
''; |
||||
}; |
||||
|
||||
package = mkOption { |
||||
type = types.package; |
||||
default = pkgs.neovim-unwrapped; |
||||
defaultText = literalExample "pkgs.neovim-unwrapped"; |
||||
description = "The package to use for the neovim binary."; |
||||
}; |
||||
|
||||
finalPackage = mkOption { |
||||
type = types.package; |
||||
visible = false; |
||||
readOnly = true; |
||||
description = "Resulting customized neovim package."; |
||||
}; |
||||
|
||||
runtime = mkOption { |
||||
default = {}; |
||||
example = literalExample '' |
||||
runtime."ftplugin/c.vim".text = "setlocal omnifunc=v:lua.vim.lsp.omnifunc"; |
||||
''; |
||||
description = '' |
||||
Set of files that have to be linked in <filename>runtime</filename>. |
||||
''; |
||||
|
||||
type = with types; attrsOf (submodule ( |
||||
{ name, config, ... }: |
||||
{ options = { |
||||
|
||||
enable = mkOption { |
||||
type = types.bool; |
||||
default = true; |
||||
description = '' |
||||
Whether this /etc file should be generated. This |
||||
option allows specific /etc files to be disabled. |
||||
''; |
||||
}; |
||||
|
||||
target = mkOption { |
||||
type = types.str; |
||||
description = '' |
||||
Name of symlink. Defaults to the attribute |
||||
name. |
||||
''; |
||||
}; |
||||
|
||||
text = mkOption { |
||||
default = null; |
||||
type = types.nullOr types.lines; |
||||
description = "Text of the file."; |
||||
}; |
||||
|
||||
source = mkOption { |
||||
type = types.path; |
||||
description = "Path of the source file."; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
config = { |
||||
target = mkDefault name; |
||||
source = mkIf (config.text != null) ( |
||||
let name' = "neovim-runtime" + baseNameOf name; |
||||
in mkDefault (pkgs.writeText name' config.text)); |
||||
}; |
||||
|
||||
})); |
||||
|
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
environment.systemPackages = [ |
||||
cfg.finalPackage |
||||
]; |
||||
environment.variables = { EDITOR = mkOverride 900 "nvim"; }; |
||||
|
||||
programs.neovim.finalPackage = pkgs.wrapNeovim cfg.package { |
||||
inherit (cfg) viAlias vimAlias; |
||||
configure = cfg.configure // { |
||||
|
||||
customRC = (cfg.configure.customRC or "") + '' |
||||
set runtimepath^=${runtime}/etc |
||||
''; |
||||
}; |
||||
}; |
||||
}; |
||||
} |
Loading…
Reference in new issue