nix-community.nixvim/plugins/by-name/aerial/default.nix
2024-12-22 10:04:00 +00:00

660 lines
22 KiB
Nix

{ lib, ... }:
let
inherit (lib.nixvim) defaultNullOpts;
inherit (lib) types;
in
lib.nixvim.plugins.mkNeovimPlugin {
name = "aerial";
packPathName = "aerial.nvim";
package = "aerial-nvim";
maintainers = [ lib.maintainers.GaetanLepage ];
settingsOptions =
let
size =
with types;
oneOf [
rawLua
ints.unsigned
(numbers.between 0.0 1.0)
];
listOfSize = with types; either size (listOf size);
# Several options can have a single value, or a filetype-value mapping.
mkTypeOrAttrsOfType =
type: default: description:
defaultNullOpts.mkNullable (
with types;
oneOf [
rawLua
type
(attrsOf type)
]
) default description;
in
{
backends =
mkTypeOrAttrsOfType (with types; listOf str)
[
"treesitter"
"lsp"
"markdown"
"asciidoc"
"man"
]
''
Priority list of preferred backends for aerial.
This can be a filetype map (see :help aerial-filetype-map)
'';
layout = {
max_width =
defaultNullOpts.mkNullable listOfSize
[
40
0.2
]
''
Maximum width of the aerial window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
For example, `[ 40 0.2 ]` means "the lesser of 40 columns or 20% of total".
'';
width = defaultNullOpts.mkNullable size null ''
Width of the aerial window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%).
'';
min_width = defaultNullOpts.mkNullable listOfSize 10 ''
Minimum width of the aerial window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
win_opts = defaultNullOpts.mkAttrsOf types.anything { } ''
Key-value pairs of window-local options for aerial window (e.g. `winhl`).
'';
default_direction =
defaultNullOpts.mkEnumFirstDefault
[
"prefer_right"
"prefer_left"
"right"
"left"
"float"
]
''
Determines the default direction to open the aerial window.
The `prefer_*` options will open the window in the other direction **if** there is a
different buffer in the way of the preferred direction.
'';
placement =
defaultNullOpts.mkEnum
[
"edge"
"window"
]
"window"
''
Determines where the aerial window will be opened
- `"edge"` - open aerial at the far right/left of the editor
- `"window"` - open aerial to the right/left of the current window
'';
resize_to_content = defaultNullOpts.mkBool true ''
When the symbols change, resize the aerial window (within min/max constraints) to fit.
'';
preserve_equality = defaultNullOpts.mkBool false ''
Preserve window size equality with (`:help CTRL-W_=`).
'';
};
attach_mode =
defaultNullOpts.mkEnumFirstDefault
[
"window"
"global"
]
''
Determines how the aerial window decides which buffer to display symbols for
- `"window"`: aerial window will display symbols for the buffer in the window from which it was opened
- `"global"`: aerial window will display symbols for the current window
'';
close_automatic_events =
defaultNullOpts.mkListOf
(types.enum [
"unfocus"
"switch_buffer"
"unsupported"
])
[ ]
''
List of enum values that configure when to auto-close the aerial window
- `"unfocus"`: close aerial when you leave the original source window
- `"switch_buffer"`: close aerial when you change buffers in the source window
- `"unsupported"`: close aerial when attaching to a buffer that has no symbol source
'';
keymaps =
defaultNullOpts.mkAttrsOf
(
with types;
oneOf [
str
(attrsOf anything)
(enum [ false ])
]
)
{
"?" = "actions.show_help";
"g?" = "actions.show_help";
"<CR>" = "actions.jump";
"<2-LeftMouse>" = "actions.jump";
"<C-v>" = "actions.jump_vsplit";
"<C-s>" = "actions.jump_split";
p = "actions.scroll";
"<C-j>" = "actions.down_and_scroll";
"<C-k>" = "actions.up_and_scroll";
"{" = "actions.prev";
"}" = "actions.next";
"[[" = "actions.prev_up";
"]]" = "actions.next_up";
q = "actions.close";
o = "actions.tree_toggle";
za = "actions.tree_toggle";
O = "actions.tree_toggle_recursive";
zA = "actions.tree_toggle_recursive";
l = "actions.tree_open";
zo = "actions.tree_open";
L = "actions.tree_open_recursive";
zO = "actions.tree_open_recursive";
h = "actions.tree_close";
zc = "actions.tree_close";
H = "actions.tree_close_recursive";
zC = "actions.tree_close_recursive";
zr = "actions.tree_increase_fold_level";
zR = "actions.tree_open_all";
zm = "actions.tree_decrease_fold_level";
zM = "actions.tree_close_all";
zx = "actions.tree_sync_folds";
zX = "actions.tree_sync_folds";
}
''
Keymaps in aerial window.
Can be any value that `vim.keymap.set` accepts OR a table of keymap options with a
`callback` (e.g. `{ callback.__raw = "function() ... end"; desc = ""; nowait = true; }`).
Additionally, if it is a string that matches "actions.<name>", it will use the mapping at
`require("aerial.actions").<name>`.
Set to `false` to remove a keymap.
'';
lazy_load = defaultNullOpts.mkBool true ''
When `true`, don't load aerial until a command or function is called.
Defaults to `true`, unless `on_attach` is provided, then it defaults to `false`.
'';
disable_max_lines = defaultNullOpts.mkUnsignedInt 10000 ''
Disable aerial on files with this many lines.
'';
disable_max_size = defaultNullOpts.mkUnsignedInt 2000000 ''
Disable aerial on files this size or larger (in bytes).
Default 2MB.
'';
filter_kind =
mkTypeOrAttrsOfType (with types; either (listOf str) (enum [ false ]))
[
"Class"
"Constructor"
"Enum"
"Function"
"Interface"
"Module"
"Method"
"Struct"
]
''
A list of all symbols to display.
Set to false to display all symbols.
This can be a filetype map (see `:help aerial-filetype-map`).
To see all available values, see `:help SymbolKind`.
'';
highlight_mode =
defaultNullOpts.mkEnumFirstDefault
[
"split_width"
"full_width"
"last"
"none"
]
''
Determines line highlighting mode when multiple splits are visible.
- `"split_width"`: Each open window will have its cursor location marked in the aerial
buffer. Each line will only be partially highlighted to indicate which window is at that
location.
- `"full_width"`: Each open window will have its cursor location marked as a full-width
highlight in the aerial buffer.
- `"last"`: Only the most-recently focused window will have its location marked in the
aerial buffer.
- `"none"`: Do not show the cursor locations in the aerial window.
'';
highlight_closest = defaultNullOpts.mkBool true ''
Highlight the closest symbol if the cursor is not exactly on one.
'';
highlight_on_hover = defaultNullOpts.mkBool false ''
Highlight the symbol in the source buffer when cursor is in the aerial win.
'';
highlight_on_jump =
defaultNullOpts.mkNullable (with types; either ints.unsigned (enum [ false ])) 300
''
When jumping to a symbol, highlight the line for this many ms.
Set to false to disable.
'';
autojump = defaultNullOpts.mkBool false ''
Jump to symbol in source window when the cursor moves.
'';
icons = mkTypeOrAttrsOfType (with types; listOf str) [ ] ''
Define symbol icons.
You can also specify `"<Symbol>Collapsed"` to change the icon when the tree is collapsed at
that symbol, or `"Collapsed"` to specify a default collapsed icon.
The default icon set is determined by the `"nerd_font"` option below.
If you have lspkind-nvim installed, it will be the default icon set.
This can be a filetype map (see `:help aerial-filetype-map`).
'';
ignore = {
unlisted_buffers = defaultNullOpts.mkBool false ''
Ignore unlisted buffers. See `:help buflisted`.
'';
diff_windows = defaultNullOpts.mkBool true ''
Ignore diff windows (setting to false will allow aerial in diff windows).
'';
filetypes = defaultNullOpts.mkListOf types.str [ ] ''
List of filetypes to ignore.
'';
buftypes =
defaultNullOpts.mkNullable
(
with types;
either (listOf str) (enum [
false
"special"
])
)
"special"
''
Ignored buftypes.
Can be one of the following:
- `false` or `null`: No buftypes are ignored.
- `"special"`: All buffers other than normal, help and man page buffers are ignored.
- list of strings: A list of buftypes to ignore.
See `:help buftype` for the possible values.
- function: A function that returns true if the buffer should be ignored or false if
it should not be ignored.
Takes two arguments, `bufnr` and `buftype`.
'';
wintypes =
defaultNullOpts.mkNullable
(
with types;
either (listOf str) (enum [
false
"special"
])
)
"special"
''
Ignored buftypes.
Can be one of the following:
- `false` or `null`: No wintypes are ignored.
- `"special"`: All windows other than normal windows are ignored.
- list of strings: A list of wintypes to ignore.
See `:help win_gettype()` for the possible values.
- function: A function that returns true if the window should be ignored or false if
it should not be ignored.
Takes two arguments, `winid` and `wintype`.
'';
};
manage_folds = mkTypeOrAttrsOfType (with types; either str bool) false ''
Use symbol tree for folding.
Set to `true` or `false` to enable/disable.
Set to `"auto"` to manage folds if your previous foldmethod was 'manual'
This can be a filetype map (see :help aerial-filetype-map)
'';
link_folds_to_tree = defaultNullOpts.mkBool false ''
When you fold code with za, zo, or zc, update the aerial tree as well.
Only works when `manage_folds = true`.
'';
link_tree_to_folds = defaultNullOpts.mkBool true ''
Fold code when you open/collapse symbols in the tree.
Only works when `manage_folds = true`.
'';
nerd_font = defaultNullOpts.mkNullable (with types; either bool (enum [ "auto" ])) "auto" ''
Set default symbol icons to use patched font icons (see https://www.nerdfonts.com/).
`"auto"` will set it to `true` if nvim-web-devicons or lspkind-nvim is installed.
'';
on_attach = defaultNullOpts.mkRaw "function(bufnr) end" ''
Call this function when aerial attaches to a buffer.
'';
on_first_symbols = defaultNullOpts.mkRaw "function(bufnr) end" ''
Call this function when aerial first sets symbols on a buffer.
'';
open_automatic = defaultNullOpts.mkBool false ''
Automatically open aerial when entering supported buffers.
This can be a function (see :help aerial-open-automatic).
'';
post_jump_cmd = defaultNullOpts.mkNullable (with types; either (enum [ false ]) str) "normal! zz" ''
Run this command after jumping to a symbol (`false` will disable).
'';
post_parse_symbol =
defaultNullOpts.mkRaw
''
function(bufnr, item, ctx)
return true
end
''
''
Invoked after each symbol is parsed, can be used to modify the parsed item, or to filter
it by returning `false`.
Arguments:
- `bufnr`: a neovim buffer number
- `item`: of type `aerial.Symbol`
- `ctx`: a record containing the following fields:
- `backend_name`: treesitter, lsp, man...
- `lang`: info about the language
- `symbols?`: specific to the lsp backend
- `symbol?`: specific to the lsp backend
- `syntax_tree?`: specific to the treesitter backend
- `match?`: specific to the treesitter backend, TS query match
'';
post_add_all_symbols =
defaultNullOpts.mkRaw
''
function(bufnr, items, ctx)
return items
end
''
''
Invoked after all symbols have been parsed and post-processed, allows to modify the
symbol structure before final display.
- `bufnr`: a neovim buffer number
- `items`: a collection of `aerial.Symbol` items, organized in a tree, with 'parent' and
'children' fields
- `ctx`: a record containing the following fields:
- `backend_name`: treesitter, lsp, man...
- `lang`: info about the language
- `symbols?`: specific to the lsp backend
- `syntax_tree?`: specific to the treesitter backend
'';
close_on_select = defaultNullOpts.mkBool false ''
When `true`, aerial will automatically close after jumping to a symbol
'';
update_events = defaultNullOpts.mkStr "TextChanged,InsertLeave" ''
The autocmds that trigger symbols update (not used for LSP backend).
'';
show_guides = defaultNullOpts.mkBool false ''
Whether show box drawing characters for the tree hierarchy.
'';
guides =
defaultNullOpts.mkAttrsOf types.str
{
mid_item = "";
last_item = "";
nested_top = " ";
whitespace = " ";
}
''
Customize the characters used when `show_guides = true`.
'';
get_highlight =
defaultNullOpts.mkRaw
''
function(symbol, is_icon, is_collapsed)
-- return "MyHighlight" .. symbol.kind
end
''
''
Set this function to override the highlight groups for certain symbols.
'';
float = {
border = defaultNullOpts.mkNullable (with types; either str (attrsOf anything)) "rounded" ''
Controls border appearance.
Passed to `nvim_open_win`.
'';
relative =
defaultNullOpts.mkEnumFirstDefault
[
"cursor"
"editor"
"win"
]
''
Determines location of floating window
- `"cursor"`: Opens float on top of the cursor
- `"editor"`: Opens float centered in the editor
- `"win"`: Opens float centered in the window
'';
max_height = defaultNullOpts.mkNullable listOfSize 0.9 ''
Maximum height of the floating window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
height = defaultNullOpts.mkNullable size null ''
Height of the floating window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%).
'';
min_height =
defaultNullOpts.mkNullable listOfSize
[
8
0.1
]
''
Minimum height of the floating window.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
For example, `[ 8 0.1 ]` means "the greater of 8 rows or 10% of total".
'';
override =
defaultNullOpts.mkRaw
''
function(conf, source_winid)
-- This is the config that will be passed to nvim_open_win.
-- Change values here to customize the layout
return conf
end
''
''
Override the config for a specific window.
'';
};
nav = {
border = defaultNullOpts.mkStr "rounded" ''
Border style for the floating nav windows.
'';
max_height = defaultNullOpts.mkNullable listOfSize 0.9 ''
Maximum height of the floating nav windows.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
min_height =
defaultNullOpts.mkNullable listOfSize
[
10
0.1
]
''
Minimum height of the floating nav windows.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
max_width = defaultNullOpts.mkNullable listOfSize 0.5 ''
Minimum width of the floating nav windows.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
min_width =
defaultNullOpts.mkNullable listOfSize
[
0.2
20
]
''
Minimum width of the floating nav windows.
It can be integers or a float between 0 and 1 (e.g. 0.4 for 40%) or a list of those.
'';
win_opts =
defaultNullOpts.mkAttrsOf types.anything
{
cursorline = true;
winblend = 10;
}
''
Key-value pairs of window-local options for aerial window (e.g. `winhl`).
'';
autojump = defaultNullOpts.mkBool false ''
Jump to symbol in source window when the cursor moves.
'';
preview = defaultNullOpts.mkBool false ''
Show a preview of the code in the right column, when there are no child symbols
'';
keymaps =
defaultNullOpts.mkAttrsOf
(
with types;
oneOf [
str
(attrsOf anything)
(enum [ false ])
]
)
{
"<CR>" = "actions.jump";
"<2-LeftMouse>" = "actions.jump";
"<C-v>" = "actions.jump_vsplit";
"<C-s>" = "actions.jump_split";
h = "actions.left";
l = "actions.right";
"<C-c>" = "actions.close";
}
''
Keymaps in the nav window.
'';
};
lsp = {
diagnostics_trigger_update = defaultNullOpts.mkBool false ''
If `true`, fetch document symbols when LSP diagnostics update.
'';
update_when_errors = defaultNullOpts.mkBool true ''
Set to false to not update the symbols when there are LSP errors.
'';
update_delay = defaultNullOpts.mkUnsignedInt 300 ''
How long to wait (in ms) after a buffer change before updating.
Only used when `diagnostics_trigger_update = false`.
'';
priority = defaultNullOpts.mkAttrsOf types.int { } ''
Map of LSP client name to priority.
Default value is `10`.
Clients with higher (larger) priority will be used before those with lower priority.
Set to `-1` to never use the client.
'';
};
treesitter = {
update_delay = defaultNullOpts.mkUnsignedInt 300 ''
How long to wait (in ms) after a buffer change before updating.
'';
};
markdown = {
update_delay = defaultNullOpts.mkUnsignedInt 300 ''
How long to wait (in ms) after a buffer change before updating.
'';
};
asciidoc = {
update_delay = defaultNullOpts.mkUnsignedInt 300 ''
How long to wait (in ms) after a buffer change before updating.
'';
};
man = {
update_delay = defaultNullOpts.mkUnsignedInt 300 ''
How long to wait (in ms) after a buffer change before updating.
'';
};
};
settingsExample = {
backends = [
"treesitter"
"lsp"
"markdown"
"man"
];
attach_mode = "global";
disable_max_lines = 5000;
highlight_on_hover = true;
ignore.filetypes = [ "gomod" ];
};
}