Mercurial > vim
changeset 10120:fb040c9d8ce9 v7.4.2331
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Sep 5 21:51:14 2016 +0200
patch 7.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)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 05 Sep 2016 22:00:06 +0200 |
parents | ed2477b5d292 |
children | 02ba0b8a13fb |
files | src/edit.c src/ex_getln.c src/proto/ex_getln.pro src/testdir/test_popup.vim src/version.c |
diffstat | 5 files changed, 35 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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;
--- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -30,7 +30,7 @@ char_u *vim_strsave_fnameescape(char_u * 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);
--- 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 -func Test_noinsert_complete() + 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