Skip to content

Commit d5d6950

Browse files
fix(#1785): retain focused node on filter toggles (#2202)
* feat(live-filter): focus selected node after clear * fix(#1785): retain focused node on filter toggle * fix(#1785): apply requested changes * fix(live-filter): focus last focused node when cleared on prompt * refactor: store last focused node in `view` module * refactor: store last focused node in view module --------- Co-authored-by: Alexander Courtis <alex@courtis.org>
1 parent 9ef6c3c commit d5d6950

File tree

3 files changed

+44
-5
lines changed

3 files changed

+44
-5
lines changed
Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,57 @@
1+
local lib = require "nvim-tree.lib"
2+
local core = require "nvim-tree.core"
3+
local utils = require "nvim-tree.utils"
14
local filters = require "nvim-tree.explorer.filters"
25
local reloaders = require "nvim-tree.actions.reloaders.reloaders"
36

47
local M = {}
58

9+
local function reload()
10+
local node = lib.get_node_at_cursor()
11+
reloaders.reload_explorer()
12+
local explorer = core.get_explorer()
13+
14+
if explorer == nil then
15+
return
16+
end
17+
18+
while node do
19+
local found_node, _ = utils.find_node(explorer.nodes, function(node_)
20+
return node_.absolute_path == node.absolute_path
21+
end)
22+
23+
if found_node or node.parent == nil then
24+
utils.focus_file(node.absolute_path)
25+
break
26+
end
27+
28+
node = node.parent
29+
end
30+
end
31+
632
function M.custom()
733
filters.config.filter_custom = not filters.config.filter_custom
8-
return reloaders.reload_explorer()
34+
reload()
935
end
1036

1137
function M.git_ignored()
1238
filters.config.filter_git_ignored = not filters.config.filter_git_ignored
13-
return reloaders.reload_explorer()
39+
reload()
1440
end
1541

1642
function M.git_clean()
1743
filters.config.filter_git_clean = not filters.config.filter_git_clean
18-
return reloaders.reload_explorer()
44+
reload()
1945
end
2046

2147
function M.no_buffer()
2248
filters.config.filter_no_buffer = not filters.config.filter_no_buffer
23-
return reloaders.reload_explorer()
49+
reload()
2450
end
2551

2652
function M.dotfiles()
2753
filters.config.filter_dotfiles = not filters.config.filter_dotfiles
28-
return reloaders.reload_explorer()
54+
reload()
2955
end
3056

3157
return M

lua/nvim-tree/live-filter.lua

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ local function create_overlay()
134134
end
135135

136136
function M.start_filtering()
137+
view.View.live_filter.prev_focused_node = require("nvim-tree.lib").get_node_at_cursor()
137138
M.filter = M.filter or ""
138139

139140
redraw()
@@ -145,9 +146,18 @@ function M.start_filtering()
145146
end
146147

147148
function M.clear_filter()
149+
local node = require("nvim-tree.lib").get_node_at_cursor()
150+
local last_node = view.View.live_filter.prev_focused_node
151+
148152
M.filter = nil
149153
reset_filter()
150154
redraw()
155+
156+
if node then
157+
utils.focus_file(node.absolute_path)
158+
elseif last_node then
159+
utils.focus_file(last_node.absolute_path)
160+
end
151161
end
152162

153163
function M.setup(opts)

lua/nvim-tree/view.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ M.View = {
1919
tabpages = {},
2020
cursors = {},
2121
hide_root_folder = false,
22+
live_filter = {
23+
prev_focused_node = nil,
24+
},
2225
winopts = {
2326
relativenumber = false,
2427
number = false,

0 commit comments

Comments
 (0)