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:
committed by
Christian Brabandt
parent
1a31c430bb
commit
a9c6f90918
@@ -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.
|
||||||
|
16
src/option.c
16
src/option.c
@@ -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 '<'
|
||||||
|
@@ -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']],
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user