fix(plugins): correct neo-tree key mappings case and improve git status handling
This commit is contained in:
1 parent
1a0e078b5d
commit
657726cc1d
1 file changed
+43
-10
+43
-10
@@ -58,6 +58,9 @@ return {
|
|||||||
-- window option, not a top level one (it used to be set top level,
|
-- window option, not a top level one (it used to be set top level,
|
||||||
-- where neo-tree ignored it)
|
-- where neo-tree ignored it)
|
||||||
auto_expand_width = true,
|
auto_expand_width = true,
|
||||||
|
-- keys must be spelled exactly like neo-tree's own defaults:
|
||||||
|
-- setup() does not case-normalize them, so `<CR>` would sit next to
|
||||||
|
-- the default `<cr>` and whichever `pairs()` reached last would win
|
||||||
mappings = {
|
mappings = {
|
||||||
["H"] = "navigate_up",
|
["H"] = "navigate_up",
|
||||||
["L"] = "set_root",
|
["L"] = "set_root",
|
||||||
@@ -65,8 +68,8 @@ return {
|
|||||||
["."] = "toggle_hidden",
|
["."] = "toggle_hidden",
|
||||||
["/"] = "fuzzy_finder",
|
["/"] = "fuzzy_finder",
|
||||||
["f"] = "filter_on_submit",
|
["f"] = "filter_on_submit",
|
||||||
["<c-x>"] = "clear_filter",
|
["<C-x>"] = "clear_filter",
|
||||||
["<CR>"] = "open_and_close_neotree",
|
["<cr>"] = "open_and_close_neotree",
|
||||||
["<S-CR>"] = "open",
|
["<S-CR>"] = "open",
|
||||||
-- Preview image under cursor via kitty's icat kitten
|
-- Preview image under cursor via kitty's icat kitten
|
||||||
["<leader>p"] = "image_kitty",
|
["<leader>p"] = "image_kitty",
|
||||||
@@ -132,13 +135,15 @@ return {
|
|||||||
},
|
},
|
||||||
filesystem = {
|
filesystem = {
|
||||||
commands = {
|
commands = {
|
||||||
-- Close neo-tree after opening a file (directories just expand)
|
-- Close neo-tree after opening a file (directories just expand).
|
||||||
|
-- The node has to be read before `open`: afterwards the tree
|
||||||
|
-- window may be gone and `tree:get_node()` errors.
|
||||||
open_and_close_neotree = function(state)
|
open_and_close_neotree = function(state)
|
||||||
|
local node = state.tree:get_node()
|
||||||
require("neo-tree.sources.filesystem.commands").open(state)
|
require("neo-tree.sources.filesystem.commands").open(state)
|
||||||
local tree = state.tree
|
if node and node.type == "file" then
|
||||||
local success, node = pcall(tree.get_node, tree)
|
require("neo-tree.command").execute { action = "close" }
|
||||||
if not success then return end
|
end
|
||||||
if node.type == "file" then require("neo-tree.command").execute { action = "close" } end
|
|
||||||
end,
|
end,
|
||||||
-- Preview an image with kitty's icat kitten in a snacks terminal
|
-- Preview an image with kitty's icat kitten in a snacks terminal
|
||||||
image_kitty = function(state)
|
image_kitty = function(state)
|
||||||
@@ -161,16 +166,44 @@ return {
|
|||||||
-- gitignore-style ignore files, read per directory by neo-tree
|
-- gitignore-style ignore files, read per directory by neo-tree
|
||||||
hide_ignored = true,
|
hide_ignored = true,
|
||||||
ignore_files = { ".neotreeignore", ".ignore", ".rgignore" },
|
ignore_files = { ".neotreeignore", ".ignore", ".rgignore" },
|
||||||
hide_by_pattern = copy(ignore_patterns.patterns),
|
-- hide_by_pattern / never_show / never_show_by_pattern are seeded
|
||||||
never_show = copy(ignore_patterns.never_show),
|
-- from config.ignore_patterns in `config` below
|
||||||
never_show_by_pattern = copy(ignore_patterns.never_show_patterns),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
-- deep merge of list values is index wise, so AstroNvim's extra sources
|
-- deep merge of list values is index wise, so AstroNvim's extra sources
|
||||||
-- survive a `sources = { "filesystem" }` override: assign instead
|
-- survive a `sources = { "filesystem" }` override: assign instead
|
||||||
opts.sources = { "filesystem" }
|
opts.sources = { "filesystem" }
|
||||||
|
-- git reports ignored paths in a second pass, and neo-tree's own
|
||||||
|
-- GIT_STATUS_CHANGED handler only redraws the nodes it already has, so
|
||||||
|
-- `!!` entries that land after the first scan stay visible until
|
||||||
|
-- something rescans. Rescan once per worktree (the flag also keeps this
|
||||||
|
-- from looping on the status the rescan itself kicks off) - this is what
|
||||||
|
-- the old BufEnter/DirChanged "refresh patterns" autocmd was papering
|
||||||
|
-- over.
|
||||||
|
local rescanned = {} ---@type table<string, true>
|
||||||
|
table.insert(opts.event_handlers, {
|
||||||
|
event = "git_status_changed",
|
||||||
|
handler = function(args)
|
||||||
|
local root = args and args.git_root
|
||||||
|
if root == nil or rescanned[root] then return end
|
||||||
|
rescanned[root] = true
|
||||||
|
require("neo-tree.sources.manager").refresh "filesystem"
|
||||||
|
end,
|
||||||
|
})
|
||||||
return opts
|
return opts
|
||||||
end,
|
end,
|
||||||
|
config = function(_, opts)
|
||||||
|
-- setup() compiles the glob lists into Lua patterns (and turns
|
||||||
|
-- `never_show` into a lookup table) in place, so re-seed them from the
|
||||||
|
-- shared module on every setup: `:Lazy reload neo-tree.nvim` re-runs
|
||||||
|
-- this with the same cached opts table, and compiling already compiled
|
||||||
|
-- patterns a second time silently breaks all pattern filtering.
|
||||||
|
local filtered = opts.filesystem.filtered_items
|
||||||
|
filtered.hide_by_pattern = copy(ignore_patterns.patterns)
|
||||||
|
filtered.never_show = copy(ignore_patterns.never_show)
|
||||||
|
filtered.never_show_by_pattern = copy(ignore_patterns.never_show_patterns)
|
||||||
|
require("neo-tree").setup(opts)
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user