From b9451dfd4c06cac6c3e85eb069af51d3a8ace490 Mon Sep 17 00:00:00 2001 From: yilisharcs Date: Mon, 27 Oct 2025 14:19:16 -0300 Subject: [PATCH] fix(ui2): emit FileType event after setting default pager options #36315 Problem: Setting a filetype before configuring default options for ui2 buffers (pager, cmd, ...) prevents users from setting their own options. Solution: Call nvim_set_option_value after defaults are set. Closes #36314 Co-authored-by: Luuk van Baal --- runtime/lua/vim/_extui/shared.lua | 16 ++++++++-------- test/functional/ui/messages2_spec.lua | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/runtime/lua/vim/_extui/shared.lua b/runtime/lua/vim/_extui/shared.lua index 208eb079ed..ed0932de69 100644 --- a/runtime/lua/vim/_extui/shared.lua +++ b/runtime/lua/vim/_extui/shared.lua @@ -65,13 +65,9 @@ function M.check_targets() end if setopt then - local name = { cmd = 'Cmd', dialog = 'Dialog', msg = 'Msg', pager = 'Pager' } - -- Fire a FileType autocommand with window context to let the user reconfigure local options. - -- First set 'eventignorewin' to avoid firing OptionSet and BufFilePost. - api.nvim_win_call(M.wins[type], function() - local ft = name[type]:sub(1, 1):lower() .. name[type]:sub(2) - api.nvim_set_option_value('filetype', ft, { scope = 'local' }) - local ignore = 'all' .. (type == 'pager' and ',-TextYankPost' or '') + -- Set options without firing OptionSet and BufFilePost. + vim._with({ win = M.wins[type], noautocmd = true }, function() + local ignore = 'all,-FileType' .. (type == 'pager' and ',-TextYankPost' or '') api.nvim_set_option_value('eventignorewin', ignore, { scope = 'local' }) api.nvim_set_option_value('wrap', true, { scope = 'local' }) api.nvim_set_option_value('linebreak', false, { scope = 'local' }) @@ -87,7 +83,11 @@ function M.check_targets() api.nvim_set_option_value('winhighlight', hl, { scope = 'local' }) end end) - api.nvim_buf_set_name(M.bufs[type], ('[%s]'):format(name[type])) + api.nvim_buf_set_name(M.bufs[type], ('[%s]'):format(type:sub(1, 1):upper() .. type:sub(2))) + -- Fire FileType with window context to let the user reconfigure local options. + vim._with({ win = M.wins[type] }, function() + api.nvim_set_option_value('filetype', type, { scope = 'local' }) + end) if type == 'pager' then -- Close pager with `q`, same as `checkhealth` diff --git a/test/functional/ui/messages2_spec.lua b/test/functional/ui/messages2_spec.lua index f3b3321ae0..718f661b8d 100644 --- a/test/functional/ui/messages2_spec.lua +++ b/test/functional/ui/messages2_spec.lua @@ -1,5 +1,6 @@ -- Tests for (protocol-driven) ui2, intended to replace the legacy message grid UI. +local t = require('test.testutil') local n = require('test.functional.testnvim')() local Screen = require('test.functional.ui.screen') @@ -418,4 +419,23 @@ describe('messages2', function() | ]]) end) + + it('FileType is fired after default options are set', function() + n.exec([[ + let g:set = {} + au FileType pager set nowrap + au OptionSet * let g:set[expand('')] = g:set->get(expand(''), 0) + 1 + echom 'foo'->repeat(&columns) + messages + ]]) + screen:expect([[ + | + {1:~ }|*9 + {3:─────────────────────────────────────────────────────}| + ^foofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofoofo| + {1: }| + | + ]]) + t.eq({ filetype = 4 }, n.eval('g:set')) -- still fires for 'filetype' + end) end)