1
0
forked from aniani/vim

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 `<Nul>`.
- Problem: `<t_xx` does not raise an error.
  Solution: Raise an error if closing `>` 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 <milly.ca@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Milly
2024-10-06 16:47:02 +02:00
committed by Christian Brabandt
parent 1a31c430bb
commit a9c6f90918
4 changed files with 35 additions and 14 deletions

View File

@@ -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 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 local to window
The key that starts a CTRL-W command in a terminal window. Other keys The key that starts a CTRL-W command in a terminal window. Other keys
are sent to the job running in the window. are sent to the job running in the window.
The <> notation can be used, e.g.: > The key can be specified as a single character, a |key-notation| (e.g.
:set termwinkey=<C-L> <Up>, <C-F>) or a letter preceded with a caret (e.g. `^F` is CTRL-F): >
:set twk=X
:set twk=^I
:set twk=<C-L>
< The string must be one key stroke but can be multiple bytes. < 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 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 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, <CR> and Enter. Some keys will not work, such as CTRL-C, <CR> and Enter.
<Esc> can be used, but hitting it twice in a row will still exit <Esc> can be used, but hitting it twice in a row will still exit
command-line as a failsafe measure. 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. <Up>, <C-F>) or a letter
preceded with a caret (e.g. `^F` is CTRL-F): >
:set wc=27
:set wc=X
:set wc=^I
:set wc=<Tab> :set wc=<Tab>
< NOTE: This option is set to the Vi default value when 'compatible' is < NOTE: This option is set to the Vi default value when 'compatible' is
set and to the Vim default value when 'compatible' is reset. set and to the Vim default value when 'compatible' is reset.

View File

@@ -2794,16 +2794,21 @@ did_set_option(
/* /*
* Convert a key name or string into a key value. * 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. * When "multi_byte" is TRUE allow for multi-byte characters.
*/ */
int int
string_to_key(char_u *arg, int multi_byte) string_to_key(char_u *arg, int multi_byte)
{ {
if (*arg == '<') if (*arg == '<' && arg[1])
return find_key_option(arg + 1, TRUE); return find_key_option(arg + 1, TRUE);
if (*arg == '^') if (*arg == '^' && arg[1])
return Ctrl_chr(arg[1]); {
int key = Ctrl_chr(arg[1]);
if (key == 0) // ^@ is <Nul>
key = K_ZERO;
return key;
}
if (multi_byte) if (multi_byte)
return PTR2CHAR(arg); return PTR2CHAR(arg);
return *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 // Don't use get_special_key_code() for t_xx, we don't want it to call
// add_termcap_entry(). // add_termcap_entry().
if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3]) if (arg[0] == 't' && arg[1] == '_' && arg[2] && arg[3])
{
if (!has_lt || arg[4] == '>')
key = TERMCAP2KEY(arg[2], arg[3]); key = TERMCAP2KEY(arg[2], arg[3]);
}
else if (has_lt) else if (has_lt)
{ {
--arg; // put arg at the '<' --arg; // put arg at the '<'

View File

@@ -59,10 +59,10 @@ let test_values = {
\ 'updatecount': [[0, 1, 8, 9999], [-1]], \ 'updatecount': [[0, 1, 8, 9999], [-1]],
\ 'updatetime': [[0, 1, 8, 9999], [-1]], \ 'updatetime': [[0, 1, 8, 9999], [-1]],
\ 'verbose': [[-1, 0, 1, 8, 9999], []], \ 'verbose': [[-1, 0, 1, 8, 9999], []],
\ 'wildchar': [[-1, 0, 100, 'x', '^Y', '<Esc>', '<t_xx>'], \ 'wildchar': [[-1, 0, 100, 'x', '^Y', '^@', '<Esc>', '<t_xx>', '<', '^'],
\ ['', 'xxx', '<xxx>', '<Esc', '<C-C>', '<NL>', '<CR>', K_KENTER]], \ ['', 'xxx', '<xxx>', '<Esc', '<t_xx', '<C-C>', '<NL>', '<CR>', K_KENTER]],
\ 'wildcharm': [[-1, 0, 100, 'x', '^Y', '<Esc>'], \ 'wildcharm': [[-1, 0, 100, 'x', '^Y', '^@', '<Esc>', '<', '^'],
\ ['', 'xxx', '<xxx>', '<Esc', '<C-C>', '<NL>', '<CR>', K_KENTER]], \ ['', 'xxx', '<xxx>', '<Esc', '<t_xx', '<C-C>', '<NL>', '<CR>', K_KENTER]],
\ 'winheight': [[1, 10, 999], [-1, 0]], \ 'winheight': [[1, 10, 999], [-1, 0]],
\ 'winminheight': [[0, 1], [-1]], \ 'winminheight': [[0, 1], [-1]],
\ 'winminwidth': [[0, 1, 10], [-1]], \ 'winminwidth': [[0, 1, 10], [-1]],
@@ -79,7 +79,8 @@ let test_values = {
\ 'bufhidden': [['', 'hide', 'wipe'], ['xxx', 'hide,wipe']], \ 'bufhidden': [['', 'hide', 'wipe'], ['xxx', 'hide,wipe']],
\ 'buftype': [['', 'help', 'nofile'], ['xxx', 'help,nofile']], \ 'buftype': [['', 'help', 'nofile'], ['xxx', 'help,nofile']],
\ 'casemap': [['', 'internal'], ['xxx']], \ 'casemap': [['', 'internal'], ['xxx']],
\ 'cedit': [['', '^Y', '<Esc>'], ['xxx', 'f', '<xxx>']], \ 'cedit': [['', '^Y', '^@', '<Esc>', '<t_xx>'],
\ ['xxx', 'f', '<xxx>', '<Esc', '<t_xx']],
\ 'clipboard': [['', 'unnamed', 'autoselect,unnamed', 'html', 'exclude:vimdisplay'], ['xxx', '\ze*', 'exclude:\\%(']], \ 'clipboard': [['', 'unnamed', 'autoselect,unnamed', 'html', 'exclude:vimdisplay'], ['xxx', '\ze*', 'exclude:\\%(']],
\ 'colorcolumn': [['', '8', '+2'], ['xxx']], \ 'colorcolumn': [['', '8', '+2'], ['xxx']],
\ 'comments': [['', 'b:#'], ['xxx']], \ 'comments': [['', 'b:#'], ['xxx']],
@@ -157,6 +158,8 @@ let test_values = {
\ 'term': [[], []], \ 'term': [[], []],
\ 'termguicolors': [[], []], \ 'termguicolors': [[], []],
\ 'termencoding': [has('gui_gtk') ? [] : ['', 'utf-8'], ['xxx']], \ 'termencoding': [has('gui_gtk') ? [] : ['', 'utf-8'], ['xxx']],
\ 'termwinkey': [['', 'f', '^Y', '^@', '<Esc>', '<t_xx>', "\u3042", '<', '^'],
\ ['<xxx>', '<Esc', '<t_xx']],
\ 'termwinsize': [['', '24x80', '0x80', '32x0', '0x0'], ['xxx', '80', '8ax9', '24x80b']], \ 'termwinsize': [['', '24x80', '0x80', '32x0', '0x0'], ['xxx', '80', '8ax9', '24x80b']],
\ 'termwintype': [['', 'winpty', 'conpty'], ['xxx']], \ 'termwintype': [['', 'winpty', 'conpty'], ['xxx']],
\ 'toolbar': [['', 'icons', 'text'], ['xxx']], \ 'toolbar': [['', 'icons', 'text'], ['xxx']],

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
762,
/**/ /**/
761, 761,
/**/ /**/