Skip to content

Commit 3c70bb4

Browse files
committed
feat: add window open/close events, restore focus to prior win on close, closes #476
1 parent a84b451 commit 3c70bb4

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

Diff for: doc/neo-tree.txt

+20
Original file line numberDiff line numberDiff line change
@@ -1061,6 +1061,26 @@ have.
10611061
"neo_tree_popup_buffer_leave"~
10621062
Fired after leaving a neo-tree popup buffer.
10631063

1064+
"neo_tree_window_before_open"~
1065+
Fired before opening a new Neo-tree window. Called with the following arg:
1066+
*neo-tree-window-event-args*
1067+
The event argument for all window events is a table with the following keys:
1068+
`winid` = the |winid| of the window being opned or closed.
1069+
`tabnr` = the tab number that the window is in.
1070+
`source` = the name of the source that is in the window, such as "filesystem".
1071+
`position` = the position of the window, i.e. "left", "bottom", "right".
1072+
1073+
"neo_tree_window_after_open"~
1074+
Fired after opening a new Neo-tree window. Called with
1075+
|neo-tree-window-event-args|.
1076+
1077+
"neo_tree_window_before_close"~
1078+
Fired before closing a Neo-tree window. Called with
1079+
|neo-tree-window-event-args|.
1080+
1081+
"neo_tree_window_after_close"~
1082+
Fired after closing a Neo-tree window. Called with
1083+
|neo-tree-window-event-args|.
10641084

10651085
NOTE: The following events are used internally and not intended for end user
10661086
usage. You can use them if you want, but beware that they may be debounced, and

Diff for: lua/neo-tree/defaults.lua

+25-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,31 @@ local config = {
132132
-- handler = function()
133133
-- vim.cmd 'highlight! Cursor guibg=#5f87af blend=0'
134134
-- end
135-
-- }
135+
-- },
136+
-- {
137+
-- event = "neo_tree_window_before_open",
138+
-- handler = function(args)
139+
-- print("neo_tree_window_before_open", vim.inspect(args))
140+
-- end
141+
-- },
142+
-- {
143+
-- event = "neo_tree_window_after_open",
144+
-- handler = function(args)
145+
-- vim.cmd("wincmd =")
146+
-- end
147+
-- },
148+
-- {
149+
-- event = "neo_tree_window_before_close",
150+
-- handler = function(args)
151+
-- print("neo_tree_window_before_close", vim.inspect(args))
152+
-- end
153+
-- },
154+
-- {
155+
-- event = "neo_tree_window_after_close",
156+
-- handler = function(args)
157+
-- vim.cmd("wincmd =")
158+
-- end
159+
-- }
136160
--},
137161
default_component_configs = {
138162
container = {

Diff for: lua/neo-tree/events/init.lua

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ local M = {
2020
NEO_TREE_BUFFER_LEAVE = "neo_tree_buffer_leave",
2121
NEO_TREE_POPUP_BUFFER_ENTER = "neo_tree_popup_buffer_enter",
2222
NEO_TREE_POPUP_BUFFER_LEAVE = "neo_tree_popup_buffer_leave",
23+
NEO_TREE_WINDOW_BEFORE_CLOSE = "neo_tree_window_before_close",
24+
NEO_TREE_WINDOW_AFTER_CLOSE = "neo_tree_window_after_close",
25+
NEO_TREE_WINDOW_BEFORE_OPEN = "neo_tree_window_before_open",
26+
NEO_TREE_WINDOW_AFTER_OPEN = "neo_tree_window_after_open",
2327
VIM_BUFFER_ADDED = "vim_buffer_added",
2428
VIM_BUFFER_CHANGED = "vim_buffer_changed",
2529
VIM_BUFFER_DELETED = "vim_buffer_deleted",

Diff for: lua/neo-tree/ui/renderer.lua

+25
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,23 @@ M.close = function(state)
9090
else
9191
local win_list = vim.api.nvim_tabpage_list_wins(0)
9292
if #win_list > 1 then
93+
local args = {
94+
position = state.current_position,
95+
source = state.name,
96+
winid = state.winid,
97+
tabnr = state.tabnr,
98+
}
99+
events.fire_event(events.NEO_TREE_WINDOW_BEFORE_CLOSE, args)
100+
-- focus the prior used window if we are closing the currently focused window
101+
local current_winid = vim.api.nvim_get_current_win()
102+
if current_winid == state.winid then
103+
local pwin = require("neo-tree").get_prior_window()
104+
if type(pwin) == "number" and pwin > 0 then
105+
pcall(vim.api.nvim_set_current_win, pwin)
106+
end
107+
end
93108
vim.api.nvim_win_close(state.winid, true)
109+
events.fire_event(events.NEO_TREE_WINDOW_AFTER_CLOSE, args)
94110
end
95111
end
96112
end
@@ -731,6 +747,13 @@ create_window = function(state)
731747
}
732748

733749
local win
750+
local event_args = {
751+
position = state.current_position,
752+
source = state.name,
753+
tabnr = state.tabnr,
754+
}
755+
events.fire_event(events.NEO_TREE_WINDOW_BEFORE_OPEN, event_args)
756+
734757
if state.current_position == "float" then
735758
state.force_float = nil
736759
-- First get the default options for floating windows.
@@ -791,6 +814,8 @@ create_window = function(state)
791814
state.bufnr = win.bufnr
792815
vim.api.nvim_buf_set_name(state.bufnr, bufname)
793816
end
817+
event_args.winid = state.winid
818+
events.fire_event(events.NEO_TREE_WINDOW_AFTER_OPEN, event_args)
794819

795820
if type(state.bufnr) == "number" then
796821
vim.api.nvim_buf_set_var(state.bufnr, "neo_tree_source", state.name)

0 commit comments

Comments
 (0)