fix(ui): exclude unfocusable windows from 'complete' "w" completion

Problem:  As in f85bc41, assume unfocusable windows to be UI windows
          whose buffer content is unexpectedly included in 'complete'
          "w" completion.
Solution: Exclude unfocusable windows when looping over windows.
(cherry picked from commit d01b2611a6)
This commit is contained in:
Luuk van Baal
2025-04-24 16:05:40 +02:00
committed by github-actions[bot]
parent 66953b16a2
commit 9909580df2
3 changed files with 27 additions and 4 deletions

View File

@ -69,8 +69,9 @@ If a window is focusable, it is part of the "navigation stack", that is,
editor commands such as :windo, |CTRL-W|, etc., will consider the window as editor commands such as :windo, |CTRL-W|, etc., will consider the window as
one that can be made the "current window". A non-focusable window will be one that can be made the "current window". A non-focusable window will be
skipped by such commands (though it can be explicitly focused by skipped by such commands (though it can be explicitly focused by
|nvim_set_current_win()|). Non-focusable windows are not listed by |:tabs|, and |nvim_set_current_win()|). Non-focusable windows are not listed by |:tabs|,
are not counted by the default 'tabline'. or counted by the default 'tabline'. Their buffer content is not included
in 'complete' "w" completion.
Windows (especially floating windows) can have many other |api-win_config| Windows (especially floating windows) can have many other |api-win_config|
properties such as "hide" and "fixed" which also affect behavior. properties such as "hide" and "fixed" which also affect behavior.

View File

@ -2460,8 +2460,8 @@ static buf_T *ins_compl_next_buf(buf_T *buf, int flag)
while (true) { while (true) {
// Move to next window (wrap to first window if at the end) // Move to next window (wrap to first window if at the end)
wp = (wp->w_next != NULL) ? wp->w_next : firstwin; wp = (wp->w_next != NULL) ? wp->w_next : firstwin;
// Break if we're back at start or found an unscanned buffer // Break if we're back at start or found an unscanned buffer (in a focusable window)
if (wp == curwin || !wp->w_buffer->b_scanned) { if (wp == curwin || (!wp->w_buffer->b_scanned && wp->w_config.focusable)) {
break; break;
} }
} }

View File

@ -1351,4 +1351,26 @@ describe('completion', function()
eq('completeopt option does not include popup', api.nvim_get_var('err_msg')) eq('completeopt option does not include popup', api.nvim_get_var('err_msg'))
end) end)
end) end)
it([[does not include buffer from non-focusable window for 'complete' "w"]], function()
local buf = api.nvim_create_buf(false, true)
local cfg = { focusable = false, relative = 'win', bufpos = { 1, 0 }, width = 1, height = 1 }
local win = api.nvim_open_win(buf, false, cfg)
api.nvim_buf_set_lines(buf, 0, -1, false, { 'foo' })
feed('i<C-N>')
screen:expect([[
^ |
{4:f}{1: }|
{1:~ }|*5
{5:-- Keyword completion (^N^P) }{9:Pattern not found} |
]])
api.nvim_win_set_config(win, { focusable = true })
feed('<Esc>i<C-N>')
screen:expect([[
foo^ |
{4:f}{1: }|
{1:~ }|*5
{5:-- Keyword completion (^N^P) The only match} |
]])
end)
end) end)