vim-patch:7.4.1150

Problem:    'langmap' applies to the first character typed in Select mode.
            (David Watson)
Solution:   Check for SELECTMODE. (Christian Brabandt, closes #572)
            Add the 'x' flag to feedkeys().

25281634cd
This commit is contained in:
Michael Ennen 2016-05-22 01:25:36 -07:00
parent 02e6914a93
commit 40e7efe91c
7 changed files with 45 additions and 12 deletions

View File

@ -3171,6 +3171,11 @@ feedkeys({string} [, {mode}]) *feedkeys()*
if coming from a mapping. This matters for undo,
opening folds, etc.
'i' Insert the string instead of appending (see above).
'x' Execute commands until typeahead is empty. This is
similar to using ":normal!". You can call feedkeys()
several times without 'x' and then one time with 'x'
(possibly with an empty {string}) to execute all the
typeahead.
Return value is always 0.
filereadable({file}) *filereadable()*

View File

@ -7857,20 +7857,22 @@ static void ex_stopinsert(exarg_T *eap)
* "remap" can be REMAP_NONE or REMAP_YES.
*/
void exec_normal_cmd(char_u *cmd, int remap, bool silent)
{
// Stuff the argument into the typeahead buffer.
ins_typebuf(cmd, remap, 0, true, silent);
exec_normal(false);
}
void exec_normal(int was_typed)
{
oparg_T oa;
/*
* Stuff the argument into the typeahead buffer.
* Execute normal_cmd() until there is no typeahead left.
*/
clear_oparg(&oa);
finish_op = FALSE;
ins_typebuf(cmd, remap, 0, TRUE, silent);
while ((!stuff_empty() || (!typebuf_typed() && typebuf.tb_len > 0))
&& !got_int) {
finish_op = false;
while ((!stuff_empty() || ((was_typed || !typebuf_typed())
&& typebuf.tb_len > 0)) && !got_int) {
update_topline_cursor();
normal_cmd(&oa, TRUE); /* execute a Normal mode cmd */
normal_cmd(&oa, true); // execute a Normal mode cmd
}
}

View File

@ -1757,7 +1757,8 @@ static int vgetorpeek(int advance)
if (c1 == K_SPECIAL)
nolmaplen = 2;
else {
LANGMAP_ADJUST(c1, (State & (CMDLINE | INSERT)) == 0);
LANGMAP_ADJUST(c1, (State & (CMDLINE | INSERT)) == 0
&& get_real_state() != SELECTMODE);
nolmaplen = 0;
}
/* First try buffer-local mappings. */

View File

@ -974,7 +974,7 @@ static int normal_execute(VimState *state, int key)
s->old_col = curwin->w_curswant;
s->c = key;
LANGMAP_ADJUST(s->c, true);
LANGMAP_ADJUST(s->c, get_real_state() != SELECTMODE);
// If a mapping was started in Visual or Select mode, remember the length
// of the mapping. This is used below to not return to Insert mode for as

View File

@ -38,6 +38,7 @@ SCRIPTS := \
NEW_TESTS = \
test_cursor_func.res \
test_help_tagjump.res \
test_langmap.res \
test_menu.res \
test_syntax.res \
test_timers.res \

View File

@ -0,0 +1,24 @@
" tests for 'langmap'
func Test_langmap()
new
set langmap=}l,^x,%v
call setline(1, ['abc'])
call feedkeys('gg0}^', 'tx')
call assert_equal('ac', getline(1))
" in Replace mode
" need silent! to avoid a delay when entering Insert mode
call setline(1, ['abcde'])
silent! call feedkeys("gg0lR%{z\<Esc>00", 'tx')
call assert_equal('a%{ze', getline(1))
" in Select mode
" need silent! to avoid a delay when entering Insert mode
call setline(1, ['abcde'])
silent! call feedkeys("gg0}%}\<C-G>}^\<Esc>00", 'tx')
call assert_equal('a}^de', getline(1))
quit!
endfunc

View File

@ -543,7 +543,7 @@ static int included_patches[] = {
// 1153,
// 1152 NA
// 1151,
// 1150,
1150,
1149,
// 1148 NA
// 1147,