fix(autocmd): 'cmdheight' OptionSet with valid window grids (#34619)

Problem:  OptionSet autocmd emitted with invalid grids after entering
          tabpage with different 'cmdheight'.
Solution: First call `tabpage_check_windows()` before changing 'cmdheight'.
          Add a test that exercises the `vim._extui` cmdline.
This commit is contained in:
luukvbaal
2025-06-24 10:25:46 +02:00
committed by GitHub
parent 6b6a4518c2
commit 5871d26779
3 changed files with 57 additions and 10 deletions

View File

@@ -4441,6 +4441,8 @@ static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, bool trigger_enter_a
use_tabpage(tp);
if (old_curtab != curtab) {
tabpage_check_windows(old_curtab);
if (p_ch != curtab->tp_ch_used) {
// Use the stored value of p_ch, so that it can be different for each tab page.
// Handle other side-effects but avoid setting frame sizes, which are still correct.
@@ -4450,9 +4452,6 @@ static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, bool trigger_enter_a
set_option_value(kOptCmdheight, NUMBER_OPTVAL(new_ch), 0);
command_frame_height = true;
}
if (old_curtab != curtab) {
tabpage_check_windows(old_curtab);
}
// We would like doing the TabEnter event first, but we don't have a

View File

@@ -0,0 +1,46 @@
-- Tests for (protocol-driven) ui2, intended to replace the legacy message grid UI.
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')
local clear, exec, exec_lua, feed = n.clear, n.exec, n.exec_lua, n.feed
describe('cmdline2', function()
local screen
before_each(function()
clear()
screen = Screen.new()
screen:add_extra_attr_ids({
[100] = { foreground = Screen.colors.Magenta1, bold = true },
})
exec_lua(function()
require('vim._extui').enable({})
end)
end)
it("no crash for invalid grid after 'cmdheight' OptionSet", function()
exec('tabnew | tabprev')
feed(':set ch=0')
screen:expect([[
{5: }{100:2}{5: [No Name] }{24: [No Name] }{2: }{24:X}|
|
{1:~ }|*11
{16::}{15:set} {16:ch}{15:=}0^ |
]])
feed('<CR>')
exec('tabnext')
screen:expect([[
{24: [No Name] }{5: }{100:2}{5: [No Name] }{2: }{24:X}|
^ |
{1:~ }|*11
{16::}{15:set} {16:ch}{15:=}0 |
]])
exec('tabnext')
screen:expect([[
{5: }{100:2}{5: [No Name] }{24: [No Name] }{2: }{24:X}|
^ |
{1:~ }|*12
]])
n.assert_alive()
end)
end)

View File

@@ -1,3 +1,5 @@
-- Tests for (protocol-driven) ui2, intended to replace the legacy message grid UI.
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')