nix-community.nixvim/plugins/utils/wilder.nix

270 lines
7.5 KiB
Nix
Raw Normal View History

{
lib,
helpers,
config,
pkgs,
...
}:
2024-05-05 19:39:35 +02:00
with lib;
let
2023-10-11 09:01:45 +02:00
cfg = config.plugins.wilder;
2024-05-05 19:39:35 +02:00
mkKeyOption =
default: desc:
helpers.defaultNullOpts.mkNullable
2024-05-05 19:39:35 +02:00
(
with types;
either str (submodule {
options = {
key = mkOption {
type = str;
description = desc;
};
fallback = mkOption {
2024-05-05 19:39:35 +02:00
type = either str (enum [ false ]);
description = ''
For a no-op, set <fallback> to "".
The fallback mappings can be disabled by setting `fallback` to 0.
Disabling the fallback mapping allows a `|<Cmd>|` mapping to be used which improves
rendering performance slightly as the mappings to be called outside the sandbox
(see `|:map-expression|`).
'';
};
};
})
2024-05-05 19:39:35 +02:00
)
default
''
${desc}
NOTE:
A string or an attrs (with keys `key` and `fallback`) representing the mapping to bind to
`|wilder#next()|`.
If a string is provided, it is automatically converted to `{key = <KEY>; fallback = <KEY>;}`.
- `mapping` is the `|cmap|` used to bind to `|wilder#next()|`.
- `fallback` is the mapping used if `|wilder#in_context()|` is false.
'';
in
{
2023-10-11 09:01:45 +02:00
imports = [
2024-05-05 19:39:35 +02:00
(mkRenamedOptionModule
[
"plugins"
"wilder-nvim"
]
[
"plugins"
"wilder"
]
2023-10-11 09:01:45 +02:00
)
];
2024-05-05 19:39:35 +02:00
options.plugins.wilder = helpers.neovim-plugin.extraOptionsOptions // {
enable = mkEnableOption "wilder-nvim";
2024-05-05 19:39:35 +02:00
package = helpers.mkPackageOption "wilder-nvim" pkgs.vimPlugins.wilder-nvim;
2024-05-05 19:39:35 +02:00
### Setup options ###
enableCmdlineEnter = helpers.defaultNullOpts.mkBool true ''
If true calls `wilder#enable_cmdline_enter()`.
Creates a new `|CmdlineEnter|` autocmd to which will start wilder when the cmdline is
entered.
'';
2024-05-05 19:39:35 +02:00
modes =
helpers.defaultNullOpts.mkNullable
(
with types;
2024-05-05 19:39:35 +02:00
listOf (enum [
"/"
"?"
":"
])
)
''["/" "?"]''
''
List of modes which wilderw will be active in.
Possible elements: '/', '?' and ':'
'';
2024-05-05 19:39:35 +02:00
wildcharm =
helpers.defaultNullOpts.mkNullable (with types; either str (enum [ false ])) "&wildchar"
''
Key to set the 'wildcharm' option to.
Can be set to v:false to skip the setting.
'';
2024-05-05 19:39:35 +02:00
nextKey = mkKeyOption "<Tab>" ''
A key to map to `wilder#next()` providing next suggestion.
'';
2024-05-05 19:39:35 +02:00
prevKey = mkKeyOption "<S-Tab>" ''
A key to map to `wilder#prev()` providing previous suggestion.
'';
2024-05-05 19:39:35 +02:00
acceptKey = mkKeyOption "<Down>" ''
Mapping to bind to `wilder#accept_completion()`.
'';
2024-05-05 19:39:35 +02:00
rejectKey = mkKeyOption "<Up>" ''
Mapping to bind to `wilder#reject_completion()`.
'';
2024-05-05 19:39:35 +02:00
acceptCompletionAutoSelect = helpers.defaultNullOpts.mkBool true ''
The `auto_select` option passed to `wilder#accept_completion()`, if mapped.
'';
2024-05-05 19:39:35 +02:00
### Other options ###
useCmdlinechanged = helpers.mkNullOrOption types.bool ''
If true, wilder will refresh queries when the `|CmdlineChanged|` autocommand is triggered.
Otherwise it will use a `|timer|` to check whether the cmdline has changed.
Using a timer will be more resource intensive.
2024-05-05 19:39:35 +02:00
Default: `exists('##CmdlineChanged')`
'';
2024-05-05 19:39:35 +02:00
interval = helpers.defaultNullOpts.mkUnsignedInt 100 ''
Interval of the `|timer|` used to check whether the cmdline has changed, in milliseconds.
Only applicable if `useCmdlinechanged` is false.
'';
2024-05-05 19:39:35 +02:00
beforeCursor = helpers.defaultNullOpts.mkBool false ''
If true, wilder will look only at the part of the cmdline before the cursor, and when
selecting a completion, the entire cmdline will be replaced.
Only applicable if `useCmdlinechanged` is false.
'';
2024-05-05 19:39:35 +02:00
usePythonRemotePlugin = helpers.mkNullOrOption types.bool ''
If true, uses the Python remote plugin.
This option can be set to false to disable the Python remote plugin.
2024-05-05 19:39:35 +02:00
This option has to be set before setting the `pipeline` option and before wilder is first
run.
2024-05-05 19:39:35 +02:00
Default: `has('python3') && (has('nvim') || exists('*yarp#py3'))`
'';
2024-05-05 19:39:35 +02:00
numWorkers = helpers.defaultNullOpts.mkUnsignedInt 2 ''
Number of workers for the Python 3 `|remote-plugin|`.
Has to be set at startup, before wilder is first run.
Setting the option after the first run has no effect.
'';
2024-05-05 19:39:35 +02:00
pipeline = helpers.mkNullOrOption (with helpers.nixvimTypes; listOf strLua) ''
Sets the pipeline to use to get completions.
See `|wilder-pipeline|`.
2024-05-05 19:39:35 +02:00
Example:
```lua
[
\'\'
2024-05-05 19:39:35 +02:00
wilder.branch(
wilder.cmdline_pipeline({
language = 'python',
fuzzy = 1,
}),
wilder.python_search_pipeline({
pattern = wilder.python_fuzzy_pattern(),
sorter = wilder.python_difflib_sorter(),
engine = 're',
})
)
\'\'
2024-05-05 19:39:35 +02:00
]
```
'';
2024-05-05 19:39:35 +02:00
renderer = helpers.defaultNullOpts.mkLuaFn "nil" ''
Sets the renderer to used to display the completions.
See `|wilder-renderer|`.
Example:
```lua
\'\'
wilder.wildmenu_renderer({
-- highlighter applies highlighting to the candidates
highlighter = wilder.basic_highlighter(),
})
\'\'
```
'';
2024-05-05 19:39:35 +02:00
preHook = helpers.defaultNullOpts.mkLuaFn "nil" ''
A function which takes a `ctx`.
This function is called when wilder starts, or when wilder becomes unhidden.
See `|wilder-hidden|`.
2024-05-05 19:39:35 +02:00
`ctx` contains no keys.
'';
2024-05-05 19:39:35 +02:00
postHook = helpers.defaultNullOpts.mkLuaFn "nil" ''
A function which takes a `ctx`.
This function is called when wilder stops, or when wilder becomes hidden.
See `|wilder-hidden|`.
2024-05-05 19:39:35 +02:00
`ctx` contains no keys.
'';
};
config =
let
setupOptions =
with cfg;
let
processKeyOpt =
key:
helpers.ifNonNull' key (
if isString key then
key
else
[
key.key
key.fallback
]
);
in
{
enable_cmdline_enter = enableCmdlineEnter;
inherit modes;
inherit wildcharm;
next_key = processKeyOpt nextKey;
previous_key = processKeyOpt prevKey;
accept_key = processKeyOpt acceptKey;
reject_key = processKeyOpt rejectKey;
accept_completion_auto_select = acceptCompletionAutoSelect;
};
options =
with cfg;
{
use_cmdlinechanged = useCmdlinechanged;
inherit interval;
before_cursor = beforeCursor;
use_python_remote_plugin = usePythonRemotePlugin;
num_workers = numWorkers;
pipeline = helpers.ifNonNull' pipeline (map helpers.mkRaw pipeline);
inherit renderer;
pre_hook = preHook;
post_hook = postHook;
}
// cfg.extraOptions;
in
mkIf cfg.enable {
2024-05-05 19:39:35 +02:00
extraPlugins = [ cfg.package ];
extraConfigLua = ''
wilder = require("wilder")
wilder.setup(${helpers.toLuaObject setupOptions})
local __wilderOptions = ${helpers.toLuaObject options}
for key, value in pairs(__wilderOptions) do
wilder.set_option(key, value)
end
'';
};
}