Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lib/neovim-plugin: Introduce plugins.*.luaConfig.* options #1876

Merged
merged 1 commit into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 44 additions & 19 deletions lib/neovim-plugin.nix
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
# colorscheme
isColorscheme ? false,
colorscheme ? name,
# luaConfig
configLocation ? if isColorscheme then "extraConfigLuaPre" else "extraConfigLua",
# For some plugins it may not make sense to have a configuration attribute, as they are
# configured through some other mean, like global variables
hasConfigAttrs ? true,
# options
originalName ? name,
# Can be a string, a list of strings, or a module option:
Expand Down Expand Up @@ -60,7 +65,14 @@
let
cfg = config.${namespace}.${name};
opt = options.${namespace}.${name};
extraConfigNamespace = if isColorscheme then "extraConfigLuaPre" else "extraConfigLua";

setupCode = ''
require('${luaName}')${setup}(${
lib.optionalString (cfg ? settings) (helpers.toLuaObject cfg.settings)
})
'';

setLuaConfig = lib.setAttrByPath (lib.toList configLocation);
in
{
meta = {
Expand Down Expand Up @@ -100,27 +112,40 @@
example = settingsExample;
};
}
// lib.optionalAttrs hasConfigAttrs {
luaConfig = lib.mkOption {
type = lib.nixvim.nixvimTypes.pluginLuaConfig;
default = { };
description = "The plugin's lua configuration";
};
}
// extraOptions;

config = lib.mkIf cfg.enable (
lib.mkMerge [
{
extraPlugins = (lib.optional installPackage cfg.package) ++ extraPlugins;
inherit extraPackages;
}
(lib.optionalAttrs callSetup {
${extraConfigNamespace} = ''
require('${luaName}')${setup}(${
lib.optionalString (cfg ? settings) (helpers.toLuaObject cfg.settings)
config =
assert lib.assertMsg (
callSetup -> configLocation != null
) "When a plugin has no config attrs and has a setup function it must have a config location";
lib.mkIf cfg.enable (
lib.mkMerge (
[
{
extraPlugins = (lib.optional installPackage cfg.package) ++ extraPlugins;
inherit extraPackages;
}
(lib.optionalAttrs (isColorscheme && (colorscheme != null)) {
colorscheme = lib.mkDefault colorscheme;
})
'';
})
(lib.optionalAttrs (isColorscheme && (colorscheme != null)) {
colorscheme = lib.mkDefault colorscheme;
})
(extraConfig cfg)
]
);
(extraConfig cfg)
]
++ (lib.optionals (!hasConfigAttrs) [
(lib.optionalAttrs callSetup (setLuaConfig setupCode))
])
++ (lib.optionals hasConfigAttrs [
(lib.optionalAttrs callSetup { ${namespace}.${name}.luaConfig.content = setupCode; })
(lib.optionalAttrs (configLocation != null) (setLuaConfig cfg.luaConfig.content))
])
)
);
};
in
{
Expand Down
34 changes: 34 additions & 0 deletions lib/types.nix
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,38 @@ rec {
types.optionDescriptionPhrase (class: class == "noun" || class == "composite") elemType
}";
};

pluginLuaConfig = types.submodule (
{ config, ... }:
{
options = {
pre = lib.mkOption {
type = types.lines;
default = "";
description = ''
Lua code inserted at the start of the plugin's configuration.
This is the same as using `lib.nixvim.utils.mkBeforeSection` when defining `content`.
'';
};
post = lib.mkOption {
type = types.lines;
default = "";
description = ''
Lua code inserted at the end of the plugin's configuration.
This is the same as using `lib.nixvim.utils.mkAfterSection` when defining `content`.
'';
};
content = lib.mkOption {
type = types.lines;
default = "";
description = "Configuration of the plugin";
};
};

config.content = lib.mkMerge [
(lib.nixvim.utils.mkBeforeSection config.pre)
(lib.nixvim.utils.mkAfterSection config.post)
Comment on lines +145 to +146
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Strictly speaking, these should each be wrapped in mkIf (config.pre != ""), to avoid unnecessary empty lines when no pre/post is defined.

Or we could drop their default and use isDefined. Or we could keep their default and use highestPrio < 1500.

Regardless of the approach used, it will likely end up kinda messy. Therefore I don't think we need to necessarily tackle it in this PR.

];
}
);
}
6 changes: 6 additions & 0 deletions lib/utils.nix
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ rec {
in
lib.concatStrings (map processWord words);

/**
Those helpers control the lua sections split in `pre, content, post`
*/
mkBeforeSection = lib.mkOrder 300;
mkAfterSection = lib.mkOrder 2000;

/**
Capitalize a string by making the first character uppercase.

Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/ccc/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ helpers.neovim-plugin.mkNeovimPlugin {
# ccc requires `termguicolors` to be enabled.
opts.termguicolors = lib.mkDefault true;

extraConfigLua = ''
plugins.ccc.luaConfig.content = ''
ccc = require('ccc')
ccc.setup(${helpers.toLuaObject cfg.settings})
'';
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/coq-nvim/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ helpers.neovim-plugin.mkNeovimPlugin {
coq_settings = cfg.settings;
};

extraConfigLua = "require('coq')";
plugins.coq-nvim.luaConfig.content = "require('coq')";

plugins.lsp = {
preConfig = ''
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/hydra/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ helpers.neovim-plugin.mkNeovimPlugin {

callSetup = false;
extraConfig = cfg: {
extraConfigLua = ''
plugins.hydra.luaConfig.content = ''
hydra = require('hydra')

hydra.setup(${helpers.toLuaObject cfg.settings})
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/mini/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
'';
}
];
extraConfigLua =
plugins.mini.luaConfig.content =
lib.foldlAttrs (lines: name: config: ''
${lines}
require(${lib.nixvim.toLuaObject "mini.${name}"}).setup(${lib.nixvim.toLuaObject config})
Expand Down
2 changes: 2 additions & 0 deletions plugins/by-name/rustaceanvim/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ helpers.neovim-plugin.mkNeovimPlugin {
};

callSetup = false;
hasConfigAttrs = false;
configLocation = null;
extraConfig =
cfg:
mkMerge [
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/telescope/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
}
) cfg.keymaps;

extraConfigLua = ''
plugins.telescope.luaConfig.content = ''
require('telescope').setup(${toLuaObject cfg.settings})

local __telescopeExtensions = ${toLuaObject cfg.enabledExtensions}
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/treesitter/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ helpers.neovim-plugin.mkNeovimPlugin {
installPackage = false;

extraConfig = cfg: {
extraConfigLua =
plugins.treesitter.luaConfig.content =
# NOTE: Upstream state that the parser MUST be at the beginning of runtimepath.
# Otherwise the parsers from Neovim takes precedent, which may be incompatible with some queries.
(optionalString (cfg.settings.parser_install_dir != null) ''
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/which-key/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
''
];

extraConfigLua = lib.optionalString opt.registrations.isDefined ''
plugins.which-key.luaConfig.content = lib.optionalString opt.registrations.isDefined ''
require("which-key").register(${toLuaObject cfg.registrations})
'';
};
Expand Down
2 changes: 1 addition & 1 deletion plugins/by-name/yanky/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ helpers.neovim-plugin.mkNeovimPlugin {
}
];

extraConfigLua = ''
plugins.yanky.luaConfig.content = ''
do
local utils = require('yanky.utils')
${optionalString config.plugins.telescope.enable "local mapping = require('yanky.telescope.mapping')"}
Expand Down
2 changes: 1 addition & 1 deletion plugins/cmp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ helpers.neovim-plugin.mkNeovimPlugin {

callSetup = false;
extraConfig = cfg: {
extraConfigLua =
plugins.cmp.luaConfig.content =
''
local cmp = require('cmp')
cmp.setup(${helpers.toLuaObject cfg.settings})
Expand Down
2 changes: 1 addition & 1 deletion plugins/colorschemes/ayu.nix
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
};

extraConfig = cfg: {
extraConfigLuaPre = ''
colorschemes.ayu.luaConfig.content = ''
local ayu = require("ayu")
ayu.setup(${toLuaObject cfg.settings})
ayu.colorscheme()
Expand Down
2 changes: 1 addition & 1 deletion plugins/colorschemes/base16/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
# `settings` can either be passed to `with_config` before calling `setup`,
# or it can be passed as `setup`'s 2nd argument.
# See https://github.com/RRethy/base16-nvim/blob/6ac181b5733518040a33017dde654059cd771b7c/lua/base16-colorscheme.lua#L107-L125
extraConfigLuaPre = ''
colorschemes.base16.luaConfig.content = ''
do
local base16 = require('${luaName}')
base16.with_config(${toLuaObject cfg.settings})
Expand Down
2 changes: 1 addition & 1 deletion plugins/colorschemes/onedark.nix
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
callSetup = false;
colorscheme = null;
extraConfig = cfg: {
extraConfigLuaPre = ''
colorschemes.onedark.luaConfig.content = ''
_onedark = require('onedark')
_onedark.setup(${lib.nixvim.toLuaObject cfg.settings})
_onedark.load()
Expand Down
2 changes: 1 addition & 1 deletion plugins/colorschemes/vscode.nix
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
};

extraConfig = cfg: {
extraConfigLuaPre = ''
colorschemes.vscode.luaConfig.content = ''
local _vscode = require("vscode")
_vscode.setup(${toLuaObject cfg.settings})
_vscode.load()
Expand Down
2 changes: 1 addition & 1 deletion plugins/none-ls/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ helpers.neovim-plugin.mkNeovimPlugin {
];

# We only do this here because of enableLspFormat
extraConfigLua = ''
plugins.none-ls.luaConfig.content = ''
require("null-ls").setup(${helpers.toLuaObject setupOptions})
'';
};
Expand Down
2 changes: 1 addition & 1 deletion plugins/pluginmanagers/lz-n.nix
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ nixvim.neovim-plugin.mkNeovimPlugin {

extraConfig = cfg: {
globals.lz_n = modules.mkAliasAndWrapDefsWithPriority id options.plugins.lz-n.settings;
extraConfigLua = mkIf (cfg.plugins != [ ]) ''
plugins.lz-n.luaConfig.content = mkIf (cfg.plugins != [ ]) ''
require('lz.n').load( ${nixvim.toLuaObject cfg.plugins})
'';
};
Expand Down
3 changes: 2 additions & 1 deletion plugins/utils/rest.nix
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,8 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin {
}
];

extraConfigLua = lib.mkIf cfg.enableTelescope ''require("telescope").load_extension("rest")'';
# TODO: There may be some interactions between this & telescope, maybe requiring #2292
plugins.rest.luaConfig.post = lib.mkIf cfg.enableTelescope ''require("telescope").load_extension("rest")'';

extraPackages = [ cfg.curlPackage ];

Expand Down
26 changes: 26 additions & 0 deletions tests/test-sources/plugins/lua-config.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
lua-config-pre-post = {
extraConfigLuaPre = ''
list = {}
'';
plugins.cmp = {
enable = true;
luaConfig = {
pre = ''
table.insert(list, "pre")
'';
content = ''
table.insert(list, "init")
'';
post = ''
table.insert(list, "post")
'';
};
};
extraConfigLuaPost = ''
if not vim.deep_equal(list, {"pre", "init", "post"}) then
vim.print("Unexpected list: " .. vim.inspect(list))
end
'';
};
}