mirror of
https://github.com/vim/vim.git
synced 2025-08-26 20:03:41 -04:00
patch 8.2.0148: mapping related function in wrong source file
Problem: Mapping related function in wrong source file. Solution: Move the function. Add a few more test cases. (Yegappan Lakshmanan, closes #5528)
This commit is contained in:
parent
03c3bd9fd0
commit
7f51bbe0d1
75
src/map.c
75
src/map.c
@ -1056,6 +1056,81 @@ static int expand_mapmodes = 0;
|
|||||||
static int expand_isabbrev = 0;
|
static int expand_isabbrev = 0;
|
||||||
static int expand_buffer = FALSE;
|
static int expand_buffer = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Translate an internal mapping/abbreviation representation into the
|
||||||
|
* corresponding external one recognized by :map/:abbrev commands.
|
||||||
|
* Respects the current B/k/< settings of 'cpoption'.
|
||||||
|
*
|
||||||
|
* This function is called when expanding mappings/abbreviations on the
|
||||||
|
* command-line.
|
||||||
|
*
|
||||||
|
* It uses a growarray to build the translation string since the latter can be
|
||||||
|
* wider than the original description. The caller has to free the string
|
||||||
|
* afterwards.
|
||||||
|
*
|
||||||
|
* Returns NULL when there is a problem.
|
||||||
|
*/
|
||||||
|
static char_u *
|
||||||
|
translate_mapping(char_u *str)
|
||||||
|
{
|
||||||
|
garray_T ga;
|
||||||
|
int c;
|
||||||
|
int modifiers;
|
||||||
|
int cpo_bslash;
|
||||||
|
int cpo_special;
|
||||||
|
|
||||||
|
ga_init(&ga);
|
||||||
|
ga.ga_itemsize = 1;
|
||||||
|
ga.ga_growsize = 40;
|
||||||
|
|
||||||
|
cpo_bslash = (vim_strchr(p_cpo, CPO_BSLASH) != NULL);
|
||||||
|
cpo_special = (vim_strchr(p_cpo, CPO_SPECI) != NULL);
|
||||||
|
|
||||||
|
for (; *str; ++str)
|
||||||
|
{
|
||||||
|
c = *str;
|
||||||
|
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL)
|
||||||
|
{
|
||||||
|
modifiers = 0;
|
||||||
|
if (str[1] == KS_MODIFIER)
|
||||||
|
{
|
||||||
|
str++;
|
||||||
|
modifiers = *++str;
|
||||||
|
c = *++str;
|
||||||
|
}
|
||||||
|
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL)
|
||||||
|
{
|
||||||
|
if (cpo_special)
|
||||||
|
{
|
||||||
|
ga_clear(&ga);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
c = TO_SPECIAL(str[1], str[2]);
|
||||||
|
if (c == K_ZERO) // display <Nul> as ^@
|
||||||
|
c = NUL;
|
||||||
|
str += 2;
|
||||||
|
}
|
||||||
|
if (IS_SPECIAL(c) || modifiers) // special key
|
||||||
|
{
|
||||||
|
if (cpo_special)
|
||||||
|
{
|
||||||
|
ga_clear(&ga);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ga_concat(&ga, get_special_key_name(c, modifiers));
|
||||||
|
continue; // for (str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c == ' ' || c == '\t' || c == Ctrl_J || c == Ctrl_V
|
||||||
|
|| (c == '<' && !cpo_special) || (c == '\\' && !cpo_bslash))
|
||||||
|
ga_append(&ga, cpo_bslash ? Ctrl_V : '\\');
|
||||||
|
if (c)
|
||||||
|
ga_append(&ga, c);
|
||||||
|
}
|
||||||
|
ga_append(&ga, NUL);
|
||||||
|
return (char_u *)(ga.ga_data);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Work out what to complete when doing command line completion of mapping
|
* Work out what to complete when doing command line completion of mapping
|
||||||
* or abbreviation names.
|
* or abbreviation names.
|
||||||
|
@ -72,7 +72,6 @@ void term_get_bg_color(char_u *r, char_u *g, char_u *b);
|
|||||||
char_u *replace_termcodes(char_u *from, char_u **bufp, int flags, int *did_simplify);
|
char_u *replace_termcodes(char_u *from, char_u **bufp, int flags, int *did_simplify);
|
||||||
void show_termcodes(void);
|
void show_termcodes(void);
|
||||||
int show_one_termcode(char_u *name, char_u *code, int printit);
|
int show_one_termcode(char_u *name, char_u *code, int printit);
|
||||||
char_u *translate_mapping(char_u *str);
|
|
||||||
void update_tcap(int attr);
|
void update_tcap(int attr);
|
||||||
void swap_tcap(void);
|
void swap_tcap(void);
|
||||||
guicolor_T gui_get_color_cmn(char_u *name);
|
guicolor_T gui_get_color_cmn(char_u *name);
|
||||||
|
75
src/term.c
75
src/term.c
@ -5936,81 +5936,6 @@ check_for_codes_from_term(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Translate an internal mapping/abbreviation representation into the
|
|
||||||
* corresponding external one recognized by :map/:abbrev commands.
|
|
||||||
* Respects the current B/k/< settings of 'cpoption'.
|
|
||||||
*
|
|
||||||
* This function is called when expanding mappings/abbreviations on the
|
|
||||||
* command-line.
|
|
||||||
*
|
|
||||||
* It uses a growarray to build the translation string since the latter can be
|
|
||||||
* wider than the original description. The caller has to free the string
|
|
||||||
* afterwards.
|
|
||||||
*
|
|
||||||
* Returns NULL when there is a problem.
|
|
||||||
*/
|
|
||||||
char_u *
|
|
||||||
translate_mapping(char_u *str)
|
|
||||||
{
|
|
||||||
garray_T ga;
|
|
||||||
int c;
|
|
||||||
int modifiers;
|
|
||||||
int cpo_bslash;
|
|
||||||
int cpo_special;
|
|
||||||
|
|
||||||
ga_init(&ga);
|
|
||||||
ga.ga_itemsize = 1;
|
|
||||||
ga.ga_growsize = 40;
|
|
||||||
|
|
||||||
cpo_bslash = (vim_strchr(p_cpo, CPO_BSLASH) != NULL);
|
|
||||||
cpo_special = (vim_strchr(p_cpo, CPO_SPECI) != NULL);
|
|
||||||
|
|
||||||
for (; *str; ++str)
|
|
||||||
{
|
|
||||||
c = *str;
|
|
||||||
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL)
|
|
||||||
{
|
|
||||||
modifiers = 0;
|
|
||||||
if (str[1] == KS_MODIFIER)
|
|
||||||
{
|
|
||||||
str++;
|
|
||||||
modifiers = *++str;
|
|
||||||
c = *++str;
|
|
||||||
}
|
|
||||||
if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL)
|
|
||||||
{
|
|
||||||
if (cpo_special)
|
|
||||||
{
|
|
||||||
ga_clear(&ga);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
c = TO_SPECIAL(str[1], str[2]);
|
|
||||||
if (c == K_ZERO) // display <Nul> as ^@
|
|
||||||
c = NUL;
|
|
||||||
str += 2;
|
|
||||||
}
|
|
||||||
if (IS_SPECIAL(c) || modifiers) // special key
|
|
||||||
{
|
|
||||||
if (cpo_special)
|
|
||||||
{
|
|
||||||
ga_clear(&ga);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ga_concat(&ga, get_special_key_name(c, modifiers));
|
|
||||||
continue; // for (str)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c == ' ' || c == '\t' || c == Ctrl_J || c == Ctrl_V
|
|
||||||
|| (c == '<' && !cpo_special) || (c == '\\' && !cpo_bslash))
|
|
||||||
ga_append(&ga, cpo_bslash ? Ctrl_V : '\\');
|
|
||||||
if (c)
|
|
||||||
ga_append(&ga, c);
|
|
||||||
}
|
|
||||||
ga_append(&ga, NUL);
|
|
||||||
return (char_u *)(ga.ga_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL))) || defined(PROTO)
|
#if (defined(MSWIN) && (!defined(FEAT_GUI) || defined(VIMDLL))) || defined(PROTO)
|
||||||
static char ksme_str[20];
|
static char ksme_str[20];
|
||||||
static char ksmr_str[20];
|
static char ksmr_str[20];
|
||||||
|
@ -476,6 +476,15 @@ func Test_list_mappings()
|
|||||||
call assert_equal(['n ,n <Nop>'],
|
call assert_equal(['n ,n <Nop>'],
|
||||||
\ execute('nmap ,n')->trim()->split("\n"))
|
\ execute('nmap ,n')->trim()->split("\n"))
|
||||||
|
|
||||||
|
" verbose map
|
||||||
|
call assert_match("\tLast set from .*/test_mapping.vim line \\d\\+$",
|
||||||
|
\ execute('verbose map ,n')->trim()->split("\n")[1])
|
||||||
|
|
||||||
|
" map to CTRL-V
|
||||||
|
exe "nmap ,k \<C-V>"
|
||||||
|
call assert_equal(['n ,k <Nop>'],
|
||||||
|
\ execute('nmap ,k')->trim()->split("\n"))
|
||||||
|
|
||||||
nmapclear
|
nmapclear
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@ -812,4 +821,36 @@ func Test_abbr_remove()
|
|||||||
call assert_equal({}, maparg('foo', 'i', 1, 1))
|
call assert_equal({}, maparg('foo', 'i', 1, 1))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" Trigger an abbreviation using a special key
|
||||||
|
func Test_abbr_trigger_special()
|
||||||
|
new
|
||||||
|
iabbr teh the
|
||||||
|
call feedkeys("iteh\<F2>\<Esc>", 'xt')
|
||||||
|
call assert_equal('the<F2>', getline(1))
|
||||||
|
iunab teh
|
||||||
|
close!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
" Test for '<' in 'cpoptions'
|
||||||
|
func Test_map_cpo_special_keycode()
|
||||||
|
set cpo-=<
|
||||||
|
imap x<Bslash>k Test
|
||||||
|
let d = maparg('x<Bslash>k', 'i', 0, 1)
|
||||||
|
call assert_equal(['x\k', 'Test', 'i'], [d.lhs, d.rhs, d.mode])
|
||||||
|
call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||||
|
call assert_equal('"imap x\k', @:)
|
||||||
|
iunmap x<Bslash>k
|
||||||
|
set cpo+=<
|
||||||
|
imap x<Bslash>k Test
|
||||||
|
let d = maparg('x<Bslash>k', 'i', 0, 1)
|
||||||
|
call assert_equal(['x<Bslash>k', 'Test', 'i'], [d.lhs, d.rhs, d.mode])
|
||||||
|
call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx')
|
||||||
|
call assert_equal('"imap x<Bslash>k', @:)
|
||||||
|
iunmap x<Bslash>k
|
||||||
|
set cpo-=<
|
||||||
|
" Modifying 'cpo' above adds some default mappings, remove them
|
||||||
|
mapclear
|
||||||
|
mapclear!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -742,6 +742,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 */
|
||||||
|
/**/
|
||||||
|
148,
|
||||||
/**/
|
/**/
|
||||||
147,
|
147,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user