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

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

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 = {

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",

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)