0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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().
This commit is contained in:
Bram Moolenaar 2016-01-21 23:32:32 +01:00
parent d6357e8f93
commit 25281634cd
8 changed files with 52 additions and 9 deletions

View File

@ -3099,6 +3099,11 @@ feedkeys({string} [, {mode}]) *feedkeys()*
if coming from a mapping. This matters for undo, if coming from a mapping. This matters for undo,
opening folds, etc. opening folds, etc.
'i' Insert the string instead of appending (see above). '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. Return value is always 0.
filereadable({file}) *filereadable()* filereadable({file}) *filereadable()*

View File

@ -10226,17 +10226,26 @@ exec_normal_cmd(cmd, remap, silent)
int remap; int remap;
int silent; int silent;
{ {
oparg_T oa; /* Stuff the argument into the typeahead buffer. */
ins_typebuf(cmd, remap, 0, TRUE, silent);
exec_normal(FALSE);
}
#endif
#if defined(FEAT_EX_EXTRA) || defined(FEAT_MENU) || defined(FEAT_EVAL) \
|| defined(PROTO)
/* /*
* Stuff the argument into the typeahead buffer.
* Execute normal_cmd() until there is no typeahead left. * Execute normal_cmd() until there is no typeahead left.
*/ */
void
exec_normal(int was_typed)
{
oparg_T oa;
clear_oparg(&oa); clear_oparg(&oa);
finish_op = FALSE; finish_op = FALSE;
ins_typebuf(cmd, remap, 0, TRUE, silent); while ((!stuff_empty() || ((was_typed || !typebuf_typed())
while ((!stuff_empty() || (!typebuf_typed() && typebuf.tb_len > 0)) && typebuf.tb_len > 0)) && !got_int)
&& !got_int)
{ {
update_topline_cursor(); update_topline_cursor();
normal_cmd(&oa, TRUE); /* execute a Normal mode cmd */ normal_cmd(&oa, TRUE); /* execute a Normal mode cmd */

View File

@ -2149,7 +2149,8 @@ vgetorpeek(advance)
else else
{ {
LANGMAP_ADJUST(c1, LANGMAP_ADJUST(c1,
(State & (CMDLINE | INSERT)) == 0); (State & (CMDLINE | INSERT)) == 0
&& get_real_state() != SELECTMODE);
nolmaplen = 0; nolmaplen = 0;
} }
#endif #endif

View File

@ -638,7 +638,7 @@ normal_cmd(oap, toplevel)
* Get the command character from the user. * Get the command character from the user.
*/ */
c = safe_vgetc(); c = safe_vgetc();
LANGMAP_ADJUST(c, TRUE); LANGMAP_ADJUST(c, get_real_state() != SELECTMODE);
/* /*
* If a mapping was started in Visual or Select mode, remember the length * If a mapping was started in Visual or Select mode, remember the length

View File

@ -50,6 +50,7 @@ int vim_mkdir_emsg(char_u *name, int prot);
FILE *open_exfile(char_u *fname, int forceit, char *mode); FILE *open_exfile(char_u *fname, int forceit, char *mode);
void update_topline_cursor(void); void update_topline_cursor(void);
void exec_normal_cmd(char_u *cmd, int remap, int silent); void exec_normal_cmd(char_u *cmd, int remap, int silent);
void exec_normal(int was_typed);
int find_cmdline_var(char_u *src, int *usedlen); int find_cmdline_var(char_u *src, int *usedlen);
char_u *eval_vars(char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped); char_u *eval_vars(char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped);
char_u *expand_sfile(char_u *arg); char_u *expand_sfile(char_u *arg);

View File

@ -173,6 +173,7 @@ NEW_TESTS = test_arglist.res \
test_cdo.res \ test_cdo.res \
test_hardcopy.res \ test_hardcopy.res \
test_increment.res \ test_increment.res \
test_langmap.res \
test_perl.res \ test_perl.res \
test_quickfix.res \ test_quickfix.res \
test_syntax.res \ test_syntax.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

@ -741,6 +741,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 */
/**/
1150,
/**/ /**/
1149, 1149,
/**/ /**/