fix(float): support close = false for floating oil windows (#162)

* docs(upstream): mark #675 as duplicate of #117 (#124)

* docs(upstream): mark #617 fixed via cherry-picked #618

Problem: Issue #617 (filetype-based icon detection) was still listed as
`open` in the upstream tracker despite being addressed by PR #618.

Solution: Update status to `fixed — cherry-picked (#618)`. Verified
with manual testing that `use_slow_filetype_detection` correctly detects
shebangs in extensionless files.

* docs(upstream): mark #675 as duplicate of #117

Problem: Issue #675 (move file into folder by renaming) was listed as
`open` despite being a duplicate of #117, the primary tracking issue
for move-by-rename (46 upvotes). Upstream already closed #675 as such.

Solution: Update status to `duplicate of #117`.

* fix(float): support `close = false` for floating oil windows

Problem: `select` with `close = false` was broken for floating oil
windows. The float auto-close autocmd would always close the window
when focus left, and there was no mechanism to preserve it.

Solution: Add `oil_keep_open` window flag set when `close = false` is
used on a float. The auto-close autocmd checks this flag before closing.
On file select, focus returns to the original window behind the float
so the file opens there, then focus restores to the float.

* docs(upstream): mark stevearc/oil.nvim#399 as fixed (#159)
This commit is contained in:
Barrett Ruth 2026-03-17 11:46:02 -04:00 committed by GitHub
parent a1b2679130
commit cbbddf6a2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 7 deletions

View file

@ -72,13 +72,13 @@ issues against this fork.
| [#392](https://github.com/stevearc/oil.nvim/issues/392) | Option to skip delete prompt | fixed | | [#392](https://github.com/stevearc/oil.nvim/issues/392) | Option to skip delete prompt | fixed |
| [#393](https://github.com/stevearc/oil.nvim/issues/393) | Auto-save on select | fixed | | [#393](https://github.com/stevearc/oil.nvim/issues/393) | Auto-save on select | fixed |
| [#396](https://github.com/stevearc/oil.nvim/issues/396) | Customize preview content | not actionable — out of scope, preview is a normal buffer; use `BufReadCmd` autocmds for custom renderers | | [#396](https://github.com/stevearc/oil.nvim/issues/396) | Customize preview content | not actionable — out of scope, preview is a normal buffer; use `BufReadCmd` autocmds for custom renderers |
| [#399](https://github.com/stevearc/oil.nvim/issues/399) | Open file without closing Oil | open | | [#399](https://github.com/stevearc/oil.nvim/issues/399) | Open file without closing Oil | fixed ([#159](https://github.com/barrettruth/canola.nvim/pull/159)) |
| [#404](https://github.com/stevearc/oil.nvim/issues/404) | Restricted UNC paths | not actionable — Windows-only | | [#404](https://github.com/stevearc/oil.nvim/issues/404) | Restricted UNC paths | not actionable — Windows-only |
| [#416](https://github.com/stevearc/oil.nvim/issues/416) | Cannot remap key to open split | fixed — cherry-picked ([#725](https://github.com/stevearc/oil.nvim/pull/725)) | | [#416](https://github.com/stevearc/oil.nvim/issues/416) | Cannot remap key to open split | fixed — cherry-picked ([#725](https://github.com/stevearc/oil.nvim/pull/725)) |
| [#431](https://github.com/stevearc/oil.nvim/issues/431) | More SSH adapter documentation | duplicate of [#525](https://github.com/stevearc/oil.nvim/issues/525) | | [#431](https://github.com/stevearc/oil.nvim/issues/431) | More SSH adapter documentation | duplicate of [#525](https://github.com/stevearc/oil.nvim/issues/525) |
| [#435](https://github.com/stevearc/oil.nvim/issues/435) | Error previewing with semantic tokens LSP | fixed — cherry-picked ([#467](https://github.com/stevearc/oil.nvim/pull/467)) | | [#435](https://github.com/stevearc/oil.nvim/issues/435) | Error previewing with semantic tokens LSP | fixed — cherry-picked ([#467](https://github.com/stevearc/oil.nvim/pull/467)) |
| [#436](https://github.com/stevearc/oil.nvim/issues/436) | Owner and group columns | consolidated into [#126](https://github.com/barrettruth/canola.nvim/issues/126) | | [#436](https://github.com/stevearc/oil.nvim/issues/436) | Owner and group columns | consolidated into [#126](https://github.com/barrettruth/canola.nvim/issues/126) |
| [#444](https://github.com/stevearc/oil.nvim/issues/444) | Opening behaviour customization | not actionable — existing API covers all use cases, reporter satisfied | | [#444](https://github.com/stevearc/oil.nvim/issues/444) | Opening behaviour customization | not actionable — existing API covers all use cases, reporter satisfied |
| [#446](https://github.com/stevearc/oil.nvim/issues/446) | Executable highlighting | cherry-picked ([#698](https://github.com/stevearc/oil.nvim/pull/698)) | | [#446](https://github.com/stevearc/oil.nvim/issues/446) | Executable highlighting | cherry-picked ([#698](https://github.com/stevearc/oil.nvim/pull/698)) |
| [#449](https://github.com/stevearc/oil.nvim/issues/449) | Renaming TypeScript files stopped working | not actionable — config issue, increase `lsp_file_methods.timeout_ms` | | [#449](https://github.com/stevearc/oil.nvim/issues/449) | Renaming TypeScript files stopped working | not actionable — config issue, increase `lsp_file_methods.timeout_ms` |
| [#450](https://github.com/stevearc/oil.nvim/issues/450) | Highlight opened file in directory listing | fixed — added `oil-recipe-highlight-opened-file` | | [#450](https://github.com/stevearc/oil.nvim/issues/450) | Highlight opened file in directory listing | fixed — added `oil-recipe-highlight-opened-file` |

View file

@ -292,9 +292,17 @@ M.open_float = function(dir, opts, cb)
if util.is_floating_win() or vim.fn.win_gettype() == 'command' then if util.is_floating_win() or vim.fn.win_gettype() == 'command' then
return return
end end
if vim.api.nvim_win_is_valid(winid) then if not vim.api.nvim_win_is_valid(winid) then
vim.api.nvim_win_close(winid, true) for _, id in ipairs(autocmds) do
vim.api.nvim_del_autocmd(id)
end
autocmds = {}
return
end end
if vim.w[winid].oil_keep_open then
return
end
vim.api.nvim_win_close(winid, true)
for _, id in ipairs(autocmds) do for _, id in ipairs(autocmds) do
vim.api.nvim_del_autocmd(id) vim.api.nvim_del_autocmd(id)
end end
@ -851,6 +859,8 @@ M.select = function(opts, callback)
local prev_win = vim.api.nvim_get_current_win() local prev_win = vim.api.nvim_get_current_win()
local oil_bufnr = vim.api.nvim_get_current_buf() local oil_bufnr = vim.api.nvim_get_current_buf()
local keep_float_open = util.is_floating_win() and opts.close == false
local float_win = keep_float_open and prev_win or nil
-- Async iter over entries so we can normalize the url before opening -- Async iter over entries so we can normalize the url before opening
local i = 1 local i = 1
@ -868,8 +878,10 @@ M.select = function(opts, callback)
return cb('Please save changes before entering new directory') return cb('Please save changes before entering new directory')
end end
else else
-- Close floating window before opening a file local is_float = util.is_floating_win()
if vim.w.is_oil_win then if is_float and opts.close == false then
vim.w.oil_keep_open = true
elseif vim.w.is_oil_win then
M.close() M.close()
end end
end end
@ -892,10 +904,23 @@ M.select = function(opts, callback)
vim.bo[filebufnr].buflisted = true vim.bo[filebufnr].buflisted = true
end end
if keep_float_open and not opts.tab then
local original_win = vim.w[float_win].oil_original_win
if original_win and vim.api.nvim_win_is_valid(original_win) then
vim.api.nvim_set_current_win(original_win)
else
for _, winid in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
if winid ~= float_win and not util.is_floating_win(winid) then
vim.api.nvim_set_current_win(winid)
break
end
end
end
end
local cmd = 'buffer' local cmd = 'buffer'
if opts.tab then if opts.tab then
vim.cmd.tabnew({ mods = mods }) vim.cmd.tabnew({ mods = mods })
-- Make sure the new buffer from tabnew gets cleaned up
vim.bo.bufhidden = 'wipe' vim.bo.bufhidden = 'wipe'
elseif opts.split then elseif opts.split then
cmd = 'sbuffer' cmd = 'sbuffer'
@ -934,6 +959,13 @@ M.select = function(opts, callback)
end) end)
end end
if float_win and vim.api.nvim_win_is_valid(float_win) then
if opts.tab then
vim.api.nvim_set_current_tabpage(vim.api.nvim_win_get_tabpage(float_win))
end
vim.api.nvim_set_current_win(float_win)
end
update_preview_window() update_preview_window()
finish() finish()