feat: tree can set collapse level

This commit is contained in:
Steven Arcangeli 2022-05-14 15:46:11 -07:00
parent b247ef50c7
commit c892e2ea82
7 changed files with 55 additions and 44 deletions

View file

@ -201,26 +201,27 @@ require("aerial").setup({
## Commands
| Command | arg | description |
| -------------------------- | ---------------------- | -------------------------------------------------------------------------- |
| `AerialToggle[!]` | `left`/`right`/`float` | Open or close the aerial window. With `[!]` cursor stays in current window |
| `AerialOpen[!]` | `left`/`right`/`float` | Open the aerial window. With `[!]` cursor stays in current window |
| `AerialOpenAll` | | Open an aerial window for each visible window |
| `AerialClose` | | Close the aerial window |
| `AerialCloseAll` | | Close all visible aerial windows |
| `AerialCloseAllButCurrent` | | Close all visible aerial windows except for the focused one |
| `AerialPrev` | N=1 | Jump backwards N symbols |
| `AerialNext` | N=1 | Jump forwards N symbols |
| `AerialPrevUp` | N=1 | Jump up the tree N levels, moving backwards |
| `AerialNextUp` | N=1 | Jump up the tree N levels, moving forwards |
| `AerialGo` | N=1, `v`/`h` | Jump to the Nth symbol |
| `AerialTreeOpen[!]` | | Expand tree at current location. `[!]` makes it recursive. |
| `AerialTreeClose[!]` | | Collapse tree at current location. `[!]` makes it recursive. |
| `AerialTreeToggle[!]` | | Toggle tree at current location. `[!]` makes it recursive. |
| `AerialTreeOpenAll` | | Open all tree nodes |
| `AerialTreeCloseAll` | | Collapse all tree nodes |
| `AerialTreeSyncFolds` | | Sync code folding with current tree state |
| `AerialInfo` | | Print out debug info related to aerial |
| Command | arg | description |
| ---------------------------- | ---------------------- | -------------------------------------------------------------------------- |
| `AerialToggle[!]` | `left`/`right`/`float` | Open or close the aerial window. With `[!]` cursor stays in current window |
| `AerialOpen[!]` | `left`/`right`/`float` | Open the aerial window. With `[!]` cursor stays in current window |
| `AerialOpenAll` | | Open an aerial window for each visible window |
| `AerialClose` | | Close the aerial window |
| `AerialCloseAll` | | Close all visible aerial windows |
| `AerialCloseAllButCurrent` | | Close all visible aerial windows except for the focused one |
| `AerialPrev` | N=1 | Jump backwards N symbols |
| `AerialNext` | N=1 | Jump forwards N symbols |
| `AerialPrevUp` | N=1 | Jump up the tree N levels, moving backwards |
| `AerialNextUp` | N=1 | Jump up the tree N levels, moving forwards |
| `AerialGo` | N=1, `v`/`h` | Jump to the Nth symbol |
| `AerialTreeOpen[!]` | | Expand tree at current location. `[!]` makes it recursive. |
| `AerialTreeClose[!]` | | Collapse tree at current location. `[!]` makes it recursive. |
| `AerialTreeToggle[!]` | | Toggle tree at current location. `[!]` makes it recursive. |
| `AerialTreeOpenAll` | | Open all tree nodes |
| `AerialTreeCloseAll` | | Collapse all tree nodes |
| `AerialTreeSetCollapseLevel` | N | Collapse symbols at a depth greater than N (0 collapses all) |
| `AerialTreeSyncFolds` | | Sync code folding with current tree state |
| `AerialInfo` | | Print out debug info related to aerial |
## Options

View file

@ -91,6 +91,10 @@ COMMANDS *aerial-commands
:AerialTreeCloseAll
Collapse all the tree nodes.
*:AerialTreeSetCollapseLevel*
:AerialTreeSetCollapseLevel
Collapse symbols at a depth greater than N (0 collapses all)
*:AerialTreeSyncFolds*
:AerialTreeSyncFolds
Sync code folding with current tree state. This ignores the

View file

@ -14,6 +14,7 @@
:AerialTreeCloseAll aerial.txt /*:AerialTreeCloseAll*
:AerialTreeOpen aerial.txt /*:AerialTreeOpen*
:AerialTreeOpenAll aerial.txt /*:AerialTreeOpenAll*
:AerialTreeSetCollapseLevel aerial.txt /*:AerialTreeSetCollapseLevel*
:AerialTreeSyncFolds aerial.txt /*:AerialTreeSyncFolds*
:AerialTreeToggle aerial.txt /*:AerialTreeToggle*
Aerial aerial.txt /*Aerial*

View file

@ -26,6 +26,7 @@ command! -bang AerialTreeToggle call luaeval('require("aerial.command")._tree_cm
command! AerialTreeOpenAll lua require'aerial'.tree_open_all()
command! AerialTreeCloseAll lua require'aerial'.tree_close_all()
command! AerialTreeSyncFolds lua require'aerial'.sync_folds()
command! -nargs=1 AerialTreeSetCollapseLevel call luaeval('require("aerial").tree_set_collapse_level(0, tonumber(_A))', <q-args>)
command! AerialInfo lua require'aerial'.info()
]])
end

View file

@ -122,7 +122,10 @@ M.maybe_set_foldmethod = function(bufnr)
vim.api.nvim_win_set_var(winid, prev_fde, fde)
vim.api.nvim_win_set_option(winid, "foldmethod", "expr")
vim.api.nvim_win_set_option(winid, "foldexpr", "v:lua.aerial_foldexpr()")
if config.link_tree_to_folds then
if config.link_folds_to_tree then
local fdl = vim.api.nvim_win_get_option(winid, "foldlevel")
require("aerial").tree_set_collapse_level(bufnr, fdl)
elseif config.link_tree_to_folds then
vim.api.nvim_win_set_option(winid, "foldlevel", 99)
end
end

View file

@ -173,33 +173,27 @@ end
-- Collapse all nodes in the symbol tree
M.tree_close_all = function(bufnr)
bufnr = bufnr or 0
local mybuf = vim.api.nvim_get_current_buf()
if bufnr == 0 then
bufnr = mybuf
end
local new_cursor_pos
local bufdata = data[bufnr]
if bufnr == mybuf and util.is_aerial_buffer(bufnr) then
local lnum = vim.api.nvim_win_get_cursor(0)[1]
local root = bufdata:get_root_of(bufdata:item(lnum))
tree.close_all(bufdata)
new_cursor_pos = bufdata:indexof(root)
else
tree.close_all(bufdata)
end
if config.link_tree_to_folds then
M.sync_folds(bufnr)
end
_post_tree_mutate(bufnr, new_cursor_pos)
M.tree_set_collapse_level(bufnr, 0)
end
-- Expand all nodes in the symbol tree
M.tree_open_all = function(bufnr)
bufnr = bufnr or 0
tree.open_all(data[bufnr])
M.tree_set_collapse_level(bufnr, 99)
end
-- 0 is all closed, use 99 to open all
M.tree_set_collapse_level = function(bufnr, level)
bufnr = util.get_buffers(bufnr or 0)
if not data:has_symbols(bufnr) then
return
end
tree.set_collapse_level(data[bufnr], level)
if config.link_tree_to_folds then
M.sync_folds(bufnr)
for _, winid in ipairs(vim.api.nvim_list_wins()) do
if vim.api.nvim_win_get_buf(winid) == bufnr then
vim.api.nvim_win_set_option(winid, "foldlevel", level)
end
end
end
_post_tree_mutate(bufnr)
end
@ -245,7 +239,7 @@ M.tree_cmd = function(action, opts)
recurse = opts.recurse,
})
end
_post_tree_mutate(new_cursor_pos)
_post_tree_mutate(0, new_cursor_pos)
end
end

View file

@ -25,6 +25,13 @@ M.open_all = function(bufdata)
bufdata.collapsed = {}
end
M.set_collapse_level = function(bufdata, level)
bufdata:visit(function(item)
local collapsed = bufdata:is_collapsable(item) and level <= item.level
bufdata:set_collapsed(item, collapsed)
end)
end
M.edit_tree_node = function(bufdata, action, index, opts)
opts = vim.tbl_extend("keep", opts or {}, {
bubble = true,