0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -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:
Bram Moolenaar 2020-01-24 20:21:19 +01:00
parent 03c3bd9fd0
commit 7f51bbe0d1
5 changed files with 118 additions and 76 deletions

View File

@ -1056,6 +1056,81 @@ static int expand_mapmodes = 0;
static int expand_isabbrev = 0;
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
* or abbreviation names.

View File

@ -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);
void show_termcodes(void);
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 swap_tcap(void);
guicolor_T gui_get_color_cmn(char_u *name);

View File

@ -5936,81 +5936,6 @@ check_for_codes_from_term(void)
}
#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)
static char ksme_str[20];
static char ksmr_str[20];

View File

@ -476,6 +476,15 @@ func Test_list_mappings()
call assert_equal(['n ,n <Nop>'],
\ 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
endfunc
@ -812,4 +821,36 @@ func Test_abbr_remove()
call assert_equal({}, maparg('foo', 'i', 1, 1))
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

View File

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