summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-09-05 21:51:14 +0200
committerBram Moolenaar <Bram@vim.org>2016-09-05 21:51:14 +0200
commit33a80eeb859a78ba93432da6fa585786cfd77249 (patch)
tree9b6f87d27beae24a9d3d15d20b310fd13a81f989
parent030cddc7ec0c3d2fe3969140cd1b92b2f18633c0 (diff)
patch 7.4.2331v7.4.2331
Problem: Using CTRL-X CTRL-V to complete a command line from Insert mode does not work after entering an expression on the command line. Solution: Don't use "ccline" when not actually using a command line. (test by Hirohito Higashi)
-rw-r--r--src/edit.c2
-rw-r--r--src/ex_getln.c9
-rw-r--r--src/proto/ex_getln.pro2
-rw-r--r--src/testdir/test_popup.vim37
-rw-r--r--src/version.c2
5 files changed, 35 insertions, 17 deletions
diff --git a/src/edit.c b/src/edit.c
index 6d985827a9..a87c155c7c 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -5304,7 +5304,7 @@ ins_complete(int c, int enable_pum)
if (compl_pattern == NULL)
return FAIL;
set_cmd_context(&compl_xp, compl_pattern,
- (int)STRLEN(compl_pattern), curs_col);
+ (int)STRLEN(compl_pattern), curs_col, FALSE);
if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL
|| compl_xp.xp_context == EXPAND_NOTHING)
/* No completion possible, use an empty pattern to get a
diff --git a/src/ex_getln.c b/src/ex_getln.c
index ed82f0fd3c..4ff9ae17a2 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4509,7 +4509,7 @@ set_expand_context(expand_T *xp)
xp->xp_context = EXPAND_NOTHING;
return;
}
- set_cmd_context(xp, ccline.cmdbuff, ccline.cmdlen, ccline.cmdpos);
+ set_cmd_context(xp, ccline.cmdbuff, ccline.cmdlen, ccline.cmdpos, TRUE);
}
void
@@ -4517,7 +4517,8 @@ set_cmd_context(
expand_T *xp,
char_u *str, /* start of command line */
int len, /* length of command line (excl. NUL) */
- int col) /* position of cursor */
+ int col, /* position of cursor */
+ int use_ccline UNUSED) /* use ccline for info */
{
int old_char = NUL;
char_u *nextcomm;
@@ -4532,14 +4533,14 @@ set_cmd_context(
nextcomm = str;
#ifdef FEAT_EVAL
- if (ccline.cmdfirstc == '=')
+ if (use_ccline && ccline.cmdfirstc == '=')
{
# ifdef FEAT_CMDL_COMPL
/* pass CMD_SIZE because there is no real command */
set_context_for_expression(xp, str, CMD_SIZE);
# endif
}
- else if (ccline.input_fn)
+ else if (use_ccline && ccline.input_fn)
{
xp->xp_context = ccline.xp_context;
xp->xp_pattern = ccline.cmdbuff;
diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro
index afc875c598..58b635b9fd 100644
--- a/src/proto/ex_getln.pro
+++ b/src/proto/ex_getln.pro
@@ -30,7 +30,7 @@ char_u *vim_strsave_fnameescape(char_u *fname, int shell);
void tilde_replace(char_u *orig_pat, int num_files, char_u **files);
char_u *sm_gettail(char_u *s);
char_u *addstar(char_u *fname, int len, int context);
-void set_cmd_context(expand_T *xp, char_u *str, int len, int col);
+void set_cmd_context(expand_T *xp, char_u *str, int len, int col, int use_ccline);
int expand_cmdline(expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches);
int ExpandGeneric(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int)), int escaped);
void globpath(char_u *path, char_u *file, garray_T *ga, int expand_options);
diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim
index dd949334c8..6e07393685 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -242,22 +242,27 @@ func! Test_popup_completion_insertmode()
iunmap <F5>
endfunc
-function! ComplTest() abort
- call complete(1, ['source', 'soundfold'])
- return ''
-endfunction
-
func Test_noinsert_complete()
+ function! s:complTest1() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+ endfunction
+
+ function! s:complTest2() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+ endfunction
+
new
set completeopt+=noinsert
- inoremap <F5> <C-R>=ComplTest()<CR>
+ inoremap <F5> <C-R>=s:complTest1()<CR>
call feedkeys("i\<F5>soun\<CR>\<CR>\<ESC>.", 'tx')
call assert_equal('soundfold', getline(1))
call assert_equal('soundfold', getline(2))
bwipe!
new
- inoremap <F5> <C-R>=Test()<CR>
+ inoremap <F5> <C-R>=s:complTest2()<CR>
call feedkeys("i\<F5>\<CR>\<ESC>", 'tx')
call assert_equal('source', getline(1))
bwipe!
@@ -266,10 +271,20 @@ func Test_noinsert_complete()
iunmap <F5>
endfunc
+func Test_compl_vim_cmds_after_register_expr()
+ function! s:test_func()
+ return 'autocmd '
+ endfunction
+ augroup AAAAA_Group
+ au!
+ augroup END
-function! Test() abort
- call complete(1, ['source', 'soundfold'])
- return ''
-endfunction
+ new
+ call feedkeys("i\<c-r>=s:test_func()\<CR>\<C-x>\<C-v>\<Esc>", 'tx')
+ call assert_equal('autocmd AAAAA_Group', getline(1))
+ autocmd! AAAAA_Group
+ augroup! AAAAA_Group
+ bwipe!
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 31324c49fe..740d978e90 100644
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2331,
+/**/
2330,
/**/
2329,