diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-11-28 09:02:10 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-28 09:02:10 +0800 |
commit | 5897994cb75b5b64a34017873119c87a75c42375 (patch) | |
tree | 7f579a1eebcd3e3487ebe5e58f33a94dc803b80d | |
parent | 76dcc7029b200e1d85024d7ba4a34c602e730dbe (diff) | |
download | rneovim-5897994cb75b5b64a34017873119c87a75c42375.tar.gz rneovim-5897994cb75b5b64a34017873119c87a75c42375.tar.bz2 rneovim-5897994cb75b5b64a34017873119c87a75c42375.zip |
vim-patch:9.1.0890: %! item not allowed for 'rulerformat' (#31369)
Problem: %! item not allowed for 'rulerformat'
(yatinlala)
Solution: also allow to use %! for rulerformat option
(Yegappan Lakshmanan)
fixes: vim/vim#16091
closes: vim/vim#16118
https://github.com/vim/vim/commit/ac023e8baae65584537aa3c11494dad6f71770af
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
-rw-r--r-- | runtime/doc/options.txt | 1 | ||||
-rw-r--r-- | runtime/lua/vim/_meta/options.lua | 1 | ||||
-rw-r--r-- | src/nvim/options.lua | 1 | ||||
-rw-r--r-- | src/nvim/optionstr.c | 6 | ||||
-rw-r--r-- | test/functional/legacy/cmdline_spec.lua | 16 | ||||
-rw-r--r-- | test/old/testdir/test_cmdline.vim | 21 |
6 files changed, 45 insertions, 1 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index ea56633c77..c5f21c64a2 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -5917,6 +5917,7 @@ A jump table for the options with a short description can be found at |Q_op|. All fields except the {item} are optional. A single percent sign can be given as "%%". + *stl-%!* When the option starts with "%!" then it is used as an expression, evaluated and the result is used as the option value. Example: >vim set statusline=%!MyStatusLine() diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua index c635d9bd3b..247b464a70 100644 --- a/runtime/lua/vim/_meta/options.lua +++ b/runtime/lua/vim/_meta/options.lua @@ -6311,6 +6311,7 @@ vim.wo.stc = vim.wo.statuscolumn --- All fields except the {item} are optional. A single percent sign can --- be given as "%%". --- +--- *stl-%!* --- When the option starts with "%!" then it is used as an expression, --- evaluated and the result is used as the option value. Example: --- diff --git a/src/nvim/options.lua b/src/nvim/options.lua index bcb05b107b..84c90e44a7 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -8407,6 +8407,7 @@ return { All fields except the {item} are optional. A single percent sign can be given as "%%". + *stl-%!* When the option starts with "%!" then it is used as an expression, evaluated and the result is used as the option value. Example: >vim set statusline=%!MyStatusLine() diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c index b47517b1a2..918443db9f 100644 --- a/src/nvim/optionstr.c +++ b/src/nvim/optionstr.c @@ -2191,7 +2191,11 @@ static const char *did_set_statustabline_rulerformat(optset_T *args, bool rulerf if (wid && *s == '(' && (errmsg = check_stl_option(p_ruf)) == NULL) { ru_wid = wid; } else { - errmsg = check_stl_option(p_ruf); + // Validate the flags in 'rulerformat' only if it doesn't point to + // a custom function ("%!" flag). + if ((*varp)[1] != '!') { + errmsg = check_stl_option(p_ruf); + } } } else if (rulerformat || s[0] != '%' || s[1] != '!') { // check 'statusline', 'winbar', 'tabline' or 'statuscolumn' diff --git a/test/functional/legacy/cmdline_spec.lua b/test/functional/legacy/cmdline_spec.lua index bf146e1322..3addcb957c 100644 --- a/test/functional/legacy/cmdline_spec.lua +++ b/test/functional/legacy/cmdline_spec.lua @@ -216,6 +216,22 @@ describe('cmdline', function() longish | ]] end) + + -- oldtest: Test_rulerformat_function() + it("'rulerformat' can use %!", function() + local screen = Screen.new(40, 2) + exec([[ + func TestRulerFn() + return '10,20%=30%%' + endfunc + ]]) + api.nvim_set_option_value('ruler', true, {}) + api.nvim_set_option_value('rulerformat', '%!TestRulerFn()', {}) + screen:expect([[ + ^ | + 10,20 30% | + ]]) + end) end) describe('cmdwin', function() diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim index 6fa3ee5250..2f34ecb414 100644 --- a/test/old/testdir/test_cmdline.vim +++ b/test/old/testdir/test_cmdline.vim @@ -4036,6 +4036,27 @@ func Test_rulerformat_position() call StopVimInTerminal(buf) endfunc +" Test for using "%!" in 'rulerformat' to use a function +func Test_rulerformat_function() + CheckScreendump + + let lines =<< trim END + func TestRulerFn() + return '10,20%=30%%' + endfunc + END + call writefile(lines, 'Xrulerformat_function', 'D') + + let buf = RunVimInTerminal('-S Xrulerformat_function', #{rows: 2, cols: 40}) + call term_sendkeys(buf, ":set ruler rulerformat=%!TestRulerFn()\<CR>") + call term_sendkeys(buf, ":redraw!\<CR>") + call term_wait(buf) + call VerifyScreenDump(buf, 'Test_rulerformat_function', {}) + + " clean up + call StopVimInTerminal(buf) +endfunc + func Test_getcompletion_usercmd() command! -nargs=* -complete=command TestCompletion echo <q-args> |