feat(options): add 'winpinned' to pin a window #39157

Problem:
- Unable to "pin" a window to prevent closing without specifically
  being targeted.
- :fclose closes hidden windows (even before visible windows).

Solution:
- Add 'winpinned' window-local option. When set, window is skipped by
  :fclose and :only. Pin the ui2 cmdline window (which should always be
  visible), so that it is not closed by :only/fclose.
- Skip over hidden (and pinned) windows with :fclose.

Co-authored-by: glepnir <glephunter@gmail.com>
This commit is contained in:
luukvbaal
2026-04-20 02:36:55 +02:00
committed by GitHub
parent 5f6abd34f5
commit fe986e5dd0
14 changed files with 88 additions and 9 deletions

View File

@@ -3861,4 +3861,28 @@ describe('API/win', function()
eq(float_win, api.nvim_get_current_win())
end)
end)
it(':fclose and :only skip hidden and pinned windows #36123', function()
local cfg = { relative = 'editor', row = 0, col = 0, width = 1, height = 1 }
local win1 = api.nvim_open_win(0, false, cfg)
command('fclose')
eq(false, api.nvim_win_is_valid(win1))
cfg.hide = true
win1 = api.nvim_open_win(0, false, cfg)
cfg.hide, cfg.focusable = false, false
local win2 = api.nvim_open_win(0, false, cfg)
command('fclose')
eq(true, api.nvim_win_is_valid(win1))
eq(false, api.nvim_win_is_valid(win2))
api.nvim_win_set_config(win1, { hide = false })
api.nvim_set_option_value('winpinned', true, { win = win1, scope = 'local' })
win2 = api.nvim_open_win(0, false, { split = 'right' })
api.nvim_set_option_value('winpinned', true, { win = win2, scope = 'local' })
command('only')
eq(true, api.nvim_win_is_valid(win1))
eq(true, api.nvim_win_is_valid(win2))
local tab2 = api.nvim_open_tabpage(0, false, {})
command('tabclose')
eq(tab2, api.nvim_get_current_tabpage())
end)
end)