plugins/nvim-ufo: migrate to mkNeovimPlugin

This commit is contained in:
Austin Horstman 2024-10-05 22:58:40 -05:00
parent fc584a3a41
commit 182ffa4583
No known key found for this signature in database
2 changed files with 165 additions and 98 deletions

View file

@ -1,87 +1,133 @@
{ {
lib, lib,
config,
pkgs,
... ...
}: }:
let let
inherit (lib.nixvim) defaultNullOpts; inherit (lib.nixvim) defaultNullOpts;
cfg = config.plugins.nvim-ufo;
in in
{ lib.nixvim.neovim-plugin.mkNeovimPlugin {
options.plugins.nvim-ufo = lib.nixvim.neovim-plugin.extraOptionsOptions // { name = "nvim-ufo";
enable = lib.mkEnableOption "nvim-ufo"; luaName = "ufo";
package = "nvim-ufo";
package = lib.mkPackageOption pkgs "nvim-ufo" { maintainers = [ lib.maintainers.khaneliman ];
default = [
"vimPlugins"
"nvim-ufo"
];
};
openFoldHlTimeout = defaultNullOpts.mkInt 400 '' # TODO: added 2024-10-05 remove after 24.11
deprecateExtraOptions = true;
optionsRenamedToSettings = [
"openFoldHlTimeout"
"providerSelector"
"closeFoldKinds"
"foldVirtTextHandler"
"enableGetFoldVirtText"
[
"preview"
"winConfig"
"border"
]
[
"preview"
"winConfig"
"winblend"
]
[
"preview"
"winConfig"
"winhighlight"
]
[
"preview"
"winConfig"
"maxheight"
]
[
"preview"
"mappings"
]
];
settingsOptions = {
open_fold_hl_timeout = defaultNullOpts.mkUnsignedInt 400 ''
Time in millisecond between the range to be highlgihted and to be cleared Time in millisecond between the range to be highlgihted and to be cleared
while opening the folded line, `0` value will disable the highlight while opening the folded line, `0` value will disable the highlight.
''; '';
providerSelector = defaultNullOpts.mkLuaFn null '' provider_selector = defaultNullOpts.mkLuaFn null ''
A lua function as a selector for fold providers. A lua function as a selector for fold providers.
''; '';
closeFoldKinds = lib.nixvim.mkNullOrOption lib.types.attrs '' close_fold_kinds_for_ft = defaultNullOpts.mkAttrsOf lib.types.anything { default = { }; } ''
After the buffer is displayed (opened for the first time), close the After the buffer is displayed (opened for the first time), close the
folds whose range with `kind` field is included in this option. For now, folds whose range with `kind` field is included in this option. For now,
'lsp' provider's standardized kinds are 'comment', 'imports' and 'region', 'lsp' provider's standardized kinds are 'comment', 'imports' and 'region',
run `UfoInspect` for details if your provider has extended the kinds. run `UfoInspect` for details if your provider has extended the kinds.
''; '';
foldVirtTextHandler = defaultNullOpts.mkLuaFn null "A lua function to customize fold virtual text"; fold_virt_text_handler = defaultNullOpts.mkLuaFn null "A lua function to customize fold virtual text.";
enableGetFoldVirtText = defaultNullOpts.mkBool false '' enable_get_fold_virt_text = defaultNullOpts.mkBool false ''
Enable a function with `lnum` as a parameter to capture the virtual text Enable a function with `lnum` as a parameter to capture the virtual text
for the folded lines and export the function to `get_fold_virt_text` field of for the folded lines and export the function to `get_fold_virt_text` field of
ctx table as 6th parameter in `fold_virt_text_handler` ctx table as 6th parameter in `fold_virt_text_handler`
''; '';
preview = { preview = {
winConfig = { win_config = {
border = defaultNullOpts.mkBorder "rounded" "preview window" ""; border = defaultNullOpts.mkBorder "rounded" "preview window" "";
winblend = defaultNullOpts.mkInt 12 "The winblend for preview window, `:h winblend`"; winblend = defaultNullOpts.mkUnsignedInt 12 "The winblend for preview window, `:h winblend`.";
winhighlight = defaultNullOpts.mkStr "Normal:Normal" "The winhighlight for preview window, `:h winhighlight`"; winhighlight = defaultNullOpts.mkStr "Normal:Normal" "The winhighlight for preview window, `:h winhighlight`.";
maxheight = defaultNullOpts.mkInt 20 "The max height of preview window"; maxheight = defaultNullOpts.mkUnsignedInt 20 "The max height of preview window.";
}; };
mappings = lib.nixvim.mkNullOrOption lib.types.attrs "Mappings for preview window"; mappings = lib.nixvim.mkNullOrOption lib.types.attrs "Mappings for preview window.";
}; };
}; };
config = settingsExample = {
let provider_selector = # Lua
options = ''
with cfg; function(bufnr, filetype, buftype)
{ local ftMap = {
open_fold_hl_timeout = openFoldHlTimeout; vim = "indent",
provider_selector = providerSelector; python = {"indent"},
close_fold_kinds = closeFoldKinds; git = ""
fold_virt_text_handler = foldVirtTextHandler; }
enable_get_fold_virt_text = enableGetFoldVirtText;
preview = with preview; { return ftMap[filetype]
inherit mappings; end
win_config = winConfig;
};
}
// cfg.extraOptions;
in
lib.mkIf cfg.enable {
extraPlugins = [ cfg.package ];
extraConfigLua = ''
require("ufo").setup(${lib.nixvim.toLuaObject options})
''; '';
}; fold_virt_text_handler = # Lua
''
function(virtText, lnum, endLnum, width, truncate)
local newVirtText = {}
local suffix = (' %d '):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, {chunkText, hlGroup})
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth)
end
break
end
curWidth = curWidth + chunkWidth
end
table.insert(newVirtText, {suffix, 'MoreMsg'})
return newVirtText
end
'';
};
} }

View file

@ -6,66 +6,87 @@
example = { example = {
plugins.nvim-ufo = { plugins.nvim-ufo = {
enable = true; enable = true;
providerSelector = '' settings = {
function(bufnr, filetype, buftype) provider_selector = # Lua
local ftMap = { ''
vim = "indent", function(bufnr, filetype, buftype)
python = {"indent"}, local ftMap = {
git = "" vim = "indent",
} python = {"indent"},
git = ""
}
return ftMap[filetype] return ftMap[filetype]
end
'';
foldVirtTextHandler = ''
function(virtText, lnum, endLnum, width, truncate)
local newVirtText = {}
local suffix = (' %d '):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, {chunkText, hlGroup})
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth)
end
break
end end
curWidth = curWidth + chunkWidth '';
end
table.insert(newVirtText, {suffix, 'MoreMsg'}) fold_virt_text_handler = # Lua
return newVirtText ''
end function(virtText, lnum, endLnum, width, truncate)
''; local newVirtText = {}
local suffix = (' %d '):format(endLnum - lnum)
local sufWidth = vim.fn.strdisplaywidth(suffix)
local targetWidth = width - sufWidth
local curWidth = 0
for _, chunk in ipairs(virtText) do
local chunkText = chunk[1]
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
if targetWidth > curWidth + chunkWidth then
table.insert(newVirtText, chunk)
else
chunkText = truncate(chunkText, targetWidth - curWidth)
local hlGroup = chunk[2]
table.insert(newVirtText, {chunkText, hlGroup})
chunkWidth = vim.fn.strdisplaywidth(chunkText)
-- str width returned from truncate() may less than 2nd argument, need padding
if curWidth + chunkWidth < targetWidth then
suffix = suffix .. (' '):rep(targetWidth - curWidth - chunkWidth)
end
break
end
curWidth = curWidth + chunkWidth
end
table.insert(newVirtText, {suffix, 'MoreMsg'})
return newVirtText
end
'';
};
}; };
}; };
defaults = { defaults = {
plugins.nvim-ufo = { plugins.nvim-ufo = {
enable = true; enable = true;
openFoldHlTimeout = 400; settings = {
providerSelector = null; open_fold_hl_timeout = 400;
closeFoldKinds = { }; provider_selector = null;
foldVirtTextHandler = null; close_fold_kinds_for_ft = {
enableGetFoldVirtText = false; default = { };
preview = { };
winConfig = { fold_virt_text_handler = null;
border = "rounded"; enable_get_fold_virt_text = false;
winblend = 12; preview = {
winhighlight = "Normal:Normal"; win_config = {
maxheight = 20; border = "rounded";
winblend = 12;
winhighlight = "Normal:Normal";
maxheight = 20;
};
mappings = {
scrollB = "";
scrollF = "";
scrollU = "";
scrollD = "";
scrollE = "<C-E>";
scrollY = "<C-Y>";
jumpTop = "";
jumpBot = "";
close = "q";
switch = "<Tab>";
trace = "<CR>";
};
}; };
mappings = { };
}; };
}; };
}; };