Skip to content

Commit 1d8cc3f

Browse files
committed
fix: cancel close_if_last_window if there is an unnamed modified buffer,
fixes #605
1 parent 9fd08eb commit 1d8cc3f

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

lua/neo-tree/setup/init.lua

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,33 @@ M.win_enter_event = function()
222222
log.trace("win_count: ", win_count)
223223
if prior_exists and win_count == 1 and vim.o.filetype == "neo-tree" then
224224
local position = vim.api.nvim_buf_get_var(0, "neo_tree_position")
225+
local source = vim.api.nvim_buf_get_var(0, "neo_tree_source")
225226
if position ~= "current" then
226227
-- close_if_last_window just doesn't make sense for a split style
227228
log.trace("last window, closing")
229+
local state = require("neo-tree.sources.manager").get_state(source)
230+
if state == nil then
231+
return
232+
end
233+
local mod = utils.get_modified_buffers()
234+
log.debug("close_if_last_window, modified files found: ", vim.inspect(mod))
235+
for filename, is_modified in pairs(mod) do
236+
if is_modified then
237+
if vim.startswith(filename, "[No Name]#") then
238+
bufnr = string.sub(filename, 11)
239+
log.trace("close_if_last_window, showing unnamed modified buffer: ", filename)
240+
vim.schedule(function()
241+
log.warn(
242+
"Cannot close because an unnamed buffer is modified. Please save or discard this file."
243+
)
244+
vim.cmd("vsplit")
245+
vim.api.nvim_win_set_width(win_id, state.window.width or 40)
246+
vim.cmd("b" .. bufnr)
247+
end)
248+
return
249+
end
250+
end
251+
end
228252
vim.cmd("q!")
229253
return
230254
end

lua/neo-tree/utils.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ M.get_modified_buffers = function()
209209
local modified_buffers = {}
210210
for _, buffer in ipairs(vim.api.nvim_list_bufs()) do
211211
local buffer_name = vim.api.nvim_buf_get_name(buffer)
212+
if buffer_name == nil or buffer_name == "" then
213+
buffer_name = "[No Name]#" .. buffer
214+
end
212215
modified_buffers[buffer_name] = vim.api.nvim_buf_get_option(buffer, "modified")
213216
end
214217
return modified_buffers

0 commit comments

Comments
 (0)