diff --git a/lua/oil/actions.lua b/lua/oil/actions.lua index 50a266ab..8dabe40a 100644 --- a/lua/oil/actions.lua +++ b/lua/oil/actions.lua @@ -143,7 +143,16 @@ M.parent = { M.close = { desc = "Close oil and restore original buffer", - callback = oil.close, + callback = function(opts) + opts = opts or {} + oil.close(opts) + end, + parameters = { + exit_if_last_buf = { + type = "boolean", + desc = "Exit vim if oil is closed as the last buffer", + }, + }, } ---@param cmd string diff --git a/lua/oil/init.lua b/lua/oil/init.lua index d6734849..7645f351 100644 --- a/lua/oil/init.lua +++ b/lua/oil/init.lua @@ -379,8 +379,13 @@ M.open = function(dir) update_preview_window() end +---@class oil.CloseOpts +---@field exit_if_last_buf? boolean Exit vim if this oil buffer is the last open buffer + ---Restore the buffer that was present when oil was opened -M.close = function() +---@param opts? oil.CloseOpts +M.close = function(opts) + opts = opts or {} -- If we're in a floating oil window, close it and try to restore focus to the original window if vim.w.is_oil_win then local original_winid = vim.w.oil_original_win @@ -403,9 +408,14 @@ M.close = function() -- buffer first local oilbuf = vim.api.nvim_get_current_buf() ok = pcall(vim.cmd.bprev) + -- If `bprev` failed, there are no buffers open if not ok then - -- If `bprev` failed, there are no buffers open so we should create a new one with enew - vim.cmd.enew() + -- either exit or create a new blank buffer + if opts.exit_if_last_buf then + vim.cmd.quit() + else + vim.cmd.enew() + end end vim.api.nvim_buf_delete(oilbuf, { force = true }) end