From a9c6f90918d0012d1b8c8c5c1dccb77407f553fb Mon Sep 17 00:00:00 2001 From: Milly Date: Sun, 6 Oct 2024 16:47:02 +0200 Subject: [PATCH] patch 9.1.0762: 'cedit', 'termwinkey' and 'wildchar' may not be parsed correctly Problem: 'cedit', 'termwinkey' and 'wildchar' may not be parsed correctly Solution: improve string_to_key() function in option.c (Milly) - Problem: `^@` raises an error. Solution: Store as ``. - Problem: `` is missing. - Problem: Single `<` or `^` raises an error. It is inconvenient for users. Solution: They are stored as a single character. closes: #15811 Signed-off-by: Milly Signed-off-by: Christian Brabandt --- runtime/doc/options.txt | 16 ++++++++++++---- src/option.c | 18 +++++++++++++----- src/testdir/gen_opt_test.vim | 13 ++++++++----- src/version.c | 2 ++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 10a06804d3..d1a0691108 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.1. Last change: 2024 Oct 02 +*options.txt* For Vim version 9.1. Last change: 2024 Oct 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -8432,8 +8432,11 @@ A jump table for the options with a short description can be found at |Q_op|. local to window The key that starts a CTRL-W command in a terminal window. Other keys are sent to the job running in the window. - The <> notation can be used, e.g.: > - :set termwinkey= + The key can be specified as a single character, a |key-notation| (e.g. + , ) or a letter preceded with a caret (e.g. `^F` is CTRL-F): > + :set twk=X + :set twk=^I + :set twk= < The string must be one key stroke but can be multiple bytes. When not set CTRL-W is used, so that CTRL-W : gets you to the command line. If 'termwinkey' is set to CTRL-L then CTRL-L : gets you to the @@ -9330,7 +9333,12 @@ A jump table for the options with a short description can be found at |Q_op|. Some keys will not work, such as CTRL-C, and Enter. can be used, but hitting it twice in a row will still exit command-line as a failsafe measure. - Although 'wc' is a number option, you can set it to a special key: > + Although 'wc' is a number option, it can be specified as a number, a + single character, a |key-notation| (e.g. , ) or a letter + preceded with a caret (e.g. `^F` is CTRL-F): > + :set wc=27 + :set wc=X + :set wc=^I :set wc= < NOTE: This option is set to the Vi default value when 'compatible' is set and to the Vim default value when 'compatible' is reset. diff --git a/src/option.c b/src/option.c index df0b647c09..cdd457b4d7 100644 --- a/src/option.c +++ b/src/option.c @@ -2794,16 +2794,21 @@ did_set_option( /* * Convert a key name or string into a key value. - * Used for 'wildchar' and 'cedit' options. + * Used for 'cedit', 'termwinkey', 'wildchar' and 'wildcharm' options. * When "multi_byte" is TRUE allow for multi-byte characters. */ int string_to_key(char_u *arg, int multi_byte) { - if (*arg == '<') + if (*arg == '<' && arg[1]) return find_key_option(arg + 1, TRUE); - if (*arg == '^') - return Ctrl_chr(arg[1]); + if (*arg == '^' && arg[1]) + { + int key = Ctrl_chr(arg[1]); + if (key == 0) // ^@ is + key = K_ZERO; + return key; + } if (multi_byte) return PTR2CHAR(arg); return *arg; @@ -5622,7 +5627,10 @@ find_key_option(char_u *arg_arg, int has_lt) // Don't use get_special_key_code() for t_xx, we don't want it to call // add_termcap_entry(). if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3]) - key = TERMCAP2KEY(arg[2], arg[3]); + { + if (!has_lt || arg[4] == '>') + key = TERMCAP2KEY(arg[2], arg[3]); + } else if (has_lt) { --arg; // put arg at the '<' diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim index 09db320eee..0d277606ca 100644 --- a/src/testdir/gen_opt_test.vim +++ b/src/testdir/gen_opt_test.vim @@ -59,10 +59,10 @@ let test_values = { \ 'updatecount': [[0, 1, 8, 9999], [-1]], \ 'updatetime': [[0, 1, 8, 9999], [-1]], \ 'verbose': [[-1, 0, 1, 8, 9999], []], - \ 'wildchar': [[-1, 0, 100, 'x', '^Y', '', ''], - \ ['', 'xxx', '', '', '', '', K_KENTER]], - \ 'wildcharm': [[-1, 0, 100, 'x', '^Y', ''], - \ ['', 'xxx', '', '', '', '', K_KENTER]], + \ 'wildchar': [[-1, 0, 100, 'x', '^Y', '^@', '', '', '<', '^'], + \ ['', 'xxx', '', '', '', '', K_KENTER]], + \ 'wildcharm': [[-1, 0, 100, 'x', '^Y', '^@', '', '<', '^'], + \ ['', 'xxx', '', '', '', '', K_KENTER]], \ 'winheight': [[1, 10, 999], [-1, 0]], \ 'winminheight': [[0, 1], [-1]], \ 'winminwidth': [[0, 1, 10], [-1]], @@ -79,7 +79,8 @@ let test_values = { \ 'bufhidden': [['', 'hide', 'wipe'], ['xxx', 'hide,wipe']], \ 'buftype': [['', 'help', 'nofile'], ['xxx', 'help,nofile']], \ 'casemap': [['', 'internal'], ['xxx']], - \ 'cedit': [['', '^Y', ''], ['xxx', 'f', '']], + \ 'cedit': [['', '^Y', '^@', '', ''], + \ ['xxx', 'f', '', '', '', "\u3042", '<', '^'], + \ ['', '