Compare commits

..

11 commits

Author SHA1 Message Date
Ching Pei Yang
8e4aed9515
Merge af9f09762a into c6453c4e69 2024-11-03 18:28:29 +00:00
Ching Pei Yang
af9f09762a
comment: remove redundant plugin 2024-11-03 19:28:24 +01:00
Ching Pei Yang
e57ef1db64
lsp: mark hack as HACK 2024-11-03 19:26:06 +01:00
Ching Pei Yang
6ef34511b1
treesitter: remove redundant code 2024-11-03 19:00:51 +01:00
Ching Pei Yang
d3ff60bd4c
cmp: skip trigger_load if lazy disabled 2024-11-03 19:00:25 +01:00
Ching Pei Yang
850465faba
doc: update configuration docs on custom plugins 2024-11-03 18:55:34 +01:00
Ching Pei Yang
02676d4224
lsp: avoid loading cmp on startup 2024-11-03 18:34:43 +01:00
Ching Pei Yang
5e6677fb1a
doc: update description of theme dag entry 2024-11-03 18:13:26 +01:00
Ching Pei Yang
a4f03076bf
theme: ensure themes load before lazy plugins 2024-11-03 18:12:08 +01:00
Ching Pei Yang
347a04b62e
cmp: deduplicate attr key 2024-11-03 18:02:50 +01:00
Ching Pei Yang
834aee6cce
lsp: use cmp_nvim_lsp capabilities 2024-11-03 17:55:51 +01:00
11 changed files with 175 additions and 75 deletions

View file

@ -20,6 +20,7 @@ custom plugins that you might have added to your configuration.
```{=include=} sections ```{=include=} sections
custom-plugins/configuring.md custom-plugins/configuring.md
custom-plugins/new-method.md custom-plugins/lazy-method.md
custom-plugins/old-method.md custom-plugins/non-lazy-method.md
custom-plugins/legacy-method.md
``` ```

View file

@ -1,12 +1,32 @@
# Configuring {#sec-configuring-plugins} # Configuring {#sec-configuring-plugins}
Just making the plugin to your Neovim configuration available might not always Just making the plugin to your Neovim configuration available might not always be enough. In that
be enough. In that case, you can write custom lua config using either case, you can write custom lua config using either `config.vim.lazy.plugins.*.setupOpts`
`config.vim.extraPlugins` (which has the `setup` field) or `config.vim.extraPlugins.*.setup` or `config.vim.luaConfigRC`.
`config.vim.luaConfigRC`. The first option uses an attribute set, which maps DAG
section names to a custom type, which has the fields `package`, `after`, The first option uses an extended version of `lz.n`'s PluginSpec. `setupModule` and `setupOpt` can
`setup`. They allow you to set the package of the plugin, the sections its setup be used if the plugin uses a `require('module').setup(...)` pattern. Otherwise, the `before` and
code should be after (note that the `extraPlugins` option has its own DAG `after` hooks should do what you need.
```nix
{
config.vim.lazy.plugins = {
aerial-nvim = {
# ^^^^^^^^^ this name should match the package.pname or package.name
package = aerial-nvim;
setupModule = "aerial";
setupOpts = {option_name = false;};
after = "print('aerial loaded')";
};
};
}
```
The second option uses an attribute set, which maps DAG section names to a custom type, which has
the fields `package`, `after`, `setup`. They allow you to set the package of the plugin, the
sections its setup code should be after (note that the `extraPlugins` option has its own DAG
scope), and the its setup code respectively. For example: scope), and the its setup code respectively. For example:
```nix ```nix
@ -24,7 +44,7 @@ config.vim.extraPlugins = with pkgs.vimPlugins; {
} }
``` ```
The second option also uses an attribute set, but this one is resolved as a DAG The third option also uses an attribute set, but this one is resolved as a DAG
directly. The attribute names denote the section names, and the values lua code. directly. The attribute names denote the section names, and the values lua code.
For example: For example:

View file

@ -0,0 +1,40 @@
# Lazy Method {#sec-lazy-method}
As of version **0.7**, we exposed an API for configuring lazy-loaded plugins via
`lz.n` and `lzn-auto-require`.
```nix
{
config.vim.lazy.plugins = {
aerial = {
package = pkgs.vimPlugins.aerial-nvim;
setupModule = aerial;
setupOpts = {
option_name = true;
};
after = ''
-- custom lua code to run after plugin is loaded
print('aerial loaded')
'';
# Explicitly mark plugin as lazy. You don't need this if you define one of
# the trigger "events" below
lazy = true;
# load on command
cmd = ["AerialOpen"];
# load on event
event = ["BufEnter"];
# load on keymap
keys = [
{
key = "<leader>a";
action = ":AerialToggle<CR>";
}
];
};
};
}
```

View file

@ -1,4 +1,4 @@
# Old Method {#sec-old-method} # Legacy Method {#sec-legacy-method}
Prior to version 0.5, the method of adding new plugins was adding the plugin Prior to version 0.5, the method of adding new plugins was adding the plugin
package to `vim.startPlugins` and add its configuration as a DAG under one of package to `vim.startPlugins` and add its configuration as a DAG under one of

View file

@ -1,4 +1,4 @@
# New Method {#sec-new-method} # Non-lazy Method {#sec-non-lazy-method}
As of version **0.5**, we have a more extensive API for configuring plugins, As of version **0.5**, we have a more extensive API for configuring plugins,
under `vim.extraPlugins`. Instead of using DAGs exposed by the library, you may under `vim.extraPlugins`. Instead of using DAGs exposed by the library, you may

View file

@ -12,9 +12,9 @@ entries in nvf:
2. `globalsScript` - used to set globals defined in `vim.globals` 2. `globalsScript` - used to set globals defined in `vim.globals`
3. `basic` - used to set basic configuration options 3. `basic` - used to set basic configuration options
4. `optionsScript` - used to set options defined in `vim.o` 4. `optionsScript` - used to set options defined in `vim.o`
5. `theme` (this is simply placed before `pluginConfigs`, meaning that 5. `theme` (this is simply placed before `pluginConfigs` and `lazyConfigs`, meaning that
surrounding entries don't depend on it) - used to set up the theme, which has surrounding entries don't depend on it) - used to set up the theme, which has to be done before
to be done before other plugins other plugins
6. `lazyConfigs` - `lz.n` and `lzn-auto-require` configs. If `vim.lazy.enable` 6. `lazyConfigs` - `lz.n` and `lzn-auto-require` configs. If `vim.lazy.enable`
is false, this will contain each plugin's config instead. is false, this will contain each plugin's config instead.
7. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option, 7. `pluginConfigs` - the result of the nested `vim.pluginRC` (internal option,

View file

@ -11,8 +11,6 @@
inherit (self.options.vim.comments.comment-nvim) mappings; inherit (self.options.vim.comments.comment-nvim) mappings;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim.startPlugins = ["comment-nvim"];
vim.lazy.plugins.comment-nvim = { vim.lazy.plugins.comment-nvim = {
package = "comment-nvim"; package = "comment-nvim";
setupModule = "Comment"; setupModule = "Comment";

View file

@ -41,13 +41,13 @@ in {
package = "nvim-cmp"; package = "nvim-cmp";
after = '' after = ''
${optionalString luasnipEnable "local luasnip = require('luasnip')"} ${optionalString luasnipEnable "local luasnip = require('luasnip')"}
require("lz.n").trigger_load("cmp-path")
local cmp = require("cmp") local cmp = require("cmp")
cmp.setup(${toLuaObject cfg.setupOpts}) cmp.setup(${toLuaObject cfg.setupOpts})
${concatStringsSep "\n" (map ${optionalString config.vim.lazy.enable
(package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})") (concatStringsSep "\n" (map
cfg.sourcePlugins)} (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
cfg.sourcePlugins))}
''; '';
event = ["InsertEnter" "CmdlineEnter"]; event = ["InsertEnter" "CmdlineEnter"];
@ -74,50 +74,50 @@ in {
}; };
formatting.format = cfg.format; formatting.format = cfg.format;
};
# `cmp` and `luasnip` are defined above, in the `nvim-cmp` section # `cmp` and `luasnip` are defined above, in the `nvim-cmp` section
setupOpts.mapping = { mapping = {
${mappings.complete} = mkLuaInline "cmp.mapping.complete()"; ${mappings.complete} = mkLuaInline "cmp.mapping.complete()";
${mappings.close} = mkLuaInline "cmp.mapping.abort()"; ${mappings.close} = mkLuaInline "cmp.mapping.abort()";
${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)"; ${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)";
${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)"; ${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)";
${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })"; ${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })";
${mappings.next} = mkLuaInline '' ${mappings.next} = mkLuaInline ''
cmp.mapping(function(fallback) cmp.mapping(function(fallback)
local has_words_before = function() local has_words_before = function()
local line, col = unpack(vim.api.nvim_win_get_cursor(0)) local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end end
if cmp.visible() then if cmp.visible() then
cmp.select_next_item() cmp.select_next_item()
${optionalString luasnipEnable '' ${optionalString luasnipEnable ''
elseif luasnip.locally_jumpable(1) then elseif luasnip.locally_jumpable(1) then
luasnip.jump(1) luasnip.jump(1)
''} ''}
elseif has_words_before() then elseif has_words_before() then
cmp.complete() cmp.complete()
else else
fallback() fallback()
end end
end) end)
''; '';
${mappings.previous} = mkLuaInline '' ${mappings.previous} = mkLuaInline ''
cmp.mapping(function(fallback) cmp.mapping(function(fallback)
if cmp.visible() then if cmp.visible() then
cmp.select_prev_item() cmp.select_prev_item()
${optionalString luasnipEnable '' ${optionalString luasnipEnable ''
elseif luasnip.locally_jumpable(-1) then elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1) luasnip.jump(-1)
''} ''}
else else
fallback() fallback()
end end
end) end)
''; '';
};
}; };
}; };
}; };

View file

@ -116,7 +116,60 @@ in {
end end
local capabilities = vim.lsp.protocol.make_client_capabilities() local capabilities = vim.lsp.protocol.make_client_capabilities()
-- ${optionalString usingNvimCmp "capabilities = require('cmp_nvim_lsp').default_capabilities()"} ${optionalString usingNvimCmp ''
-- HACK: copied from cmp-nvim-lsp. If we ever lazy load lspconfig we
-- should re-evaluate whether we can just use `default_capabilities`
capabilities = {
textDocument = {
completion = {
dynamicRegistration = false,
completionItem = {
snippetSupport = true,
commitCharactersSupport = true,
deprecatedSupport = true,
preselectSupport = true,
tagSupport = {
valueSet = {
1, -- Deprecated
}
},
insertReplaceSupport = true,
resolveSupport = {
properties = {
"documentation",
"detail",
"additionalTextEdits",
"sortText",
"filterText",
"insertText",
"textEdit",
"insertTextFormat",
"insertTextMode",
},
},
insertTextModeSupport = {
valueSet = {
1, -- asIs
2, -- adjustIndentation
}
},
labelDetailsSupport = true,
},
contextSupport = true,
insertTextMode = 1,
completionList = {
itemDefaults = {
'commitCharacters',
'editRange',
'insertTextFormat',
'insertTextMode',
'data',
}
}
},
},
}
''}
''; '';
}; };
}; };

View file

@ -66,7 +66,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim = { vim = {
startPlugins = [cfg.name]; startPlugins = [cfg.name];
luaConfigRC.theme = entryBefore ["pluginConfigs"] '' luaConfigRC.theme = entryBefore ["pluginConfigs" "lazyConfigs"] ''
${cfg.extraConfig} ${cfg.extraConfig}
${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent base16-colors;}} ${supportedThemes.${cfg.name}.setup {inherit (cfg) style transparent base16-colors;}}
''; '';

View file

@ -11,7 +11,6 @@
inherit (lib.nvim.dag) entryBefore entryAfter; inherit (lib.nvim.dag) entryBefore entryAfter;
cfg = config.vim.treesitter; cfg = config.vim.treesitter;
usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable;
self = import ./treesitter.nix {inherit pkgs lib;}; self = import ./treesitter.nix {inherit pkgs lib;};
mappingDefinitions = self.options.vim.treesitter.mappings; mappingDefinitions = self.options.vim.treesitter.mappings;
@ -21,17 +20,6 @@ in {
vim = { vim = {
startPlugins = ["nvim-treesitter"]; startPlugins = ["nvim-treesitter"];
lazy.plugins = {
cmp-treesitter = mkIf usingNvimCmp {
package = "cmp-treesitter";
after = ''
local path = vim.fn.globpath(vim.o.packpath, 'pack/*/opt/cmp-treesitter')
require("rtp_nvim").source_after_plugin_dir(path)
'';
};
nvim-cmp.after = mkIf usingNvimCmp "require('lz.n').trigger_load('cmp-treesitter')";
};
autocomplete.nvim-cmp = { autocomplete.nvim-cmp = {
sources = {treesitter = "[Treesitter]";}; sources = {treesitter = "[Treesitter]";};
sourcePlugins = ["cmp-treesitter"]; sourcePlugins = ["cmp-treesitter"];