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:
parent
a1b2679130
commit
cbbddf6a2e
2 changed files with 39 additions and 7 deletions
|
|
@ -72,7 +72,7 @@ issues against this fork.
|
|||
| [#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 |
|
||||
| [#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 |
|
||||
| [#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) |
|
||||
|
|
|
|||
|
|
@ -292,9 +292,17 @@ M.open_float = function(dir, opts, cb)
|
|||
if util.is_floating_win() or vim.fn.win_gettype() == 'command' then
|
||||
return
|
||||
end
|
||||
if vim.api.nvim_win_is_valid(winid) then
|
||||
vim.api.nvim_win_close(winid, true)
|
||||
if not vim.api.nvim_win_is_valid(winid) then
|
||||
for _, id in ipairs(autocmds) do
|
||||
vim.api.nvim_del_autocmd(id)
|
||||
end
|
||||
autocmds = {}
|
||||
return
|
||||
end
|
||||
if vim.w[winid].oil_keep_open then
|
||||
return
|
||||
end
|
||||
vim.api.nvim_win_close(winid, true)
|
||||
for _, id in ipairs(autocmds) do
|
||||
vim.api.nvim_del_autocmd(id)
|
||||
end
|
||||
|
|
@ -851,6 +859,8 @@ M.select = function(opts, callback)
|
|||
|
||||
local prev_win = vim.api.nvim_get_current_win()
|
||||
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
|
||||
local i = 1
|
||||
|
|
@ -868,8 +878,10 @@ M.select = function(opts, callback)
|
|||
return cb('Please save changes before entering new directory')
|
||||
end
|
||||
else
|
||||
-- Close floating window before opening a file
|
||||
if vim.w.is_oil_win then
|
||||
local is_float = util.is_floating_win()
|
||||
if is_float and opts.close == false then
|
||||
vim.w.oil_keep_open = true
|
||||
elseif vim.w.is_oil_win then
|
||||
M.close()
|
||||
end
|
||||
end
|
||||
|
|
@ -892,10 +904,23 @@ M.select = function(opts, callback)
|
|||
vim.bo[filebufnr].buflisted = true
|
||||
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'
|
||||
if opts.tab then
|
||||
vim.cmd.tabnew({ mods = mods })
|
||||
-- Make sure the new buffer from tabnew gets cleaned up
|
||||
vim.bo.bufhidden = 'wipe'
|
||||
elseif opts.split then
|
||||
cmd = 'sbuffer'
|
||||
|
|
@ -934,6 +959,13 @@ M.select = function(opts, callback)
|
|||
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()
|
||||
|
||||
finish()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue