blob: 60608f6a8e93a9a793ec296d0761d58a887c32a6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
{ lib, config, pkgs, ... }: let
cfg = config.programs._neovim;
extraPlugins = cfg.plugins.packages // {
start = (cfg.plugins.packages.start or [])
++ lib.optionals cfg.plugins.lsp.enable [ cfg.plugins.lsp.pluginPackage ]
++ lib.optionals cfg.plugins.treesitter.enable [ cfg.plugins.treesitter.pluginPackage ]
++ lib.optionals cfg.plugins.treesitter.enable cfg.plugins.treesitter.parsers.packages;
};
pluginDir = pkgs.linkFarm "nvim-site"
(lib.concatLists (lib.mapAttrsToList (stage: plugins:
map (plugin: {
name = "share/nvim/site/pack/plugins/${stage}/${plugin.name}";
path = plugin;
}) plugins
) extraPlugins));
extraPackages = cfg.extraPackages
++ lib.optionals cfg.plugins.lsp.enable cfg.plugins.lsp.languageServers.packages;
finalPackage = pkgs.symlinkJoin {
name = "neovim-not-wrapped";
paths = [ cfg.package ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/nvim \
--prefix PATH : ${pkgs.lib.makeBinPath extraPackages} \
--prefix XDG_DATA_DIRS : ${pluginDir}/share
'' + lib.optionalString cfg.viAlias ''
ln -s $out/bin/nvim $out/bin/vi
'' + lib.optionalString cfg.vimAlias ''
ln -s $out/bin/nvim $out/bin/vim
'';
};
in {
options.programs._neovim = {
enable = lib.mkEnableOption "install and configure neovim";
package = lib.mkPackageOption pkgs "neovim" {};
viAlias = lib.mkEnableOption "alias vi => nvim";
vimAlias = lib.mkEnableOption "alias vim => nvim";
plugins = {
lsp = {
enable = lib.mkEnableOption "install defined language servers into nvim path";
pluginPackage = lib.mkPackageOption pkgs.vimPlugins "nvim-lspconfig" {};
languageServers.packages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
description = "language server packages to add to nvim path when lsp is enabled";
};
};
treesitter = {
enable = lib.mkEnableOption "install treesitter and parsers as nvim plugins";
pluginPackage = lib.mkPackageOption pkgs.vimPlugins "nvim-treesitter" {};
parsers.packages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
description = "treesitter parsers to install as plugins";
};
};
packages = lib.mkOption {
type = lib.types.attrsOf (lib.types.listOf lib.types.package);
default = [ ];
example = {
start = with pkgs.vimPlugins; [
nvim-colorizer-lua
];
};
description = "extra plugins to be made available to nvim via packpath, organized by stage";
};
};
extraPackages = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = [ ];
description = "extra packages to add to nvim path";
};
};
config = lib.mkIf cfg.enable {
# NOTE: Don't use programs.neovim since that will build neovim from source
home.packages = [ finalPackage ];
};
}
|