从正常模式打开完成弹出窗口

open a completion popup from normal mode

给了这个脚本(简化了软件包建议,原来的处理

function! CompleteImport()
  let packages = ['java.util.Vector','java.lang.String']
  call complete(col('.'),packages)
  return ''
endfunction

inoremap <F8> import <C-R>=CompleteImport()<CR>

在插入模式下,您可以添加导入并在建议的包之间进行选择,按 F8

但我希望能够从正常模式进入弹出式选择

function! InsertImport() 
   exe "normal iimport \<C-R>=CompleteImport()\<CR>"
   "this commented line would work too
   "exe "normal i\<F8>" 
endfunction 

map <Leader>ji :call InsertImport()<CR> 

所以从正常模式,ji(代表java导入)如果找到的话,添加一个导入到光标下的单词

(移动到正确的位置不是问题所以我在这里省略)

到现在,ji 从弹出窗口添加第一个建议并存在插入模式

我试过 :startinsert 但没有成功。

查看 http://vimdoc.sourceforge.net/htmldoc/eval.html#:execute 有一个建议的代码:

:execute "normal ixxx\<Esc>"

但是最后的 Esc 根本不重要(至少对于我的 vim 安装)这对我来说完全一样:

:execute "normal ixxx"

如果我没有在文档上找到它,我认为这是不可能的。那么,可以停留在从函数调用的弹出窗口上吗?

其他感兴趣的文档:

http://vimdoc.sourceforge.net/htmldoc/various.html#:normal http://vimdoc.sourceforge.net/htmldoc/insert.html#:startinsert

:startinsert 通常是正确的方法,但它确实将控制权交还给用户,因此您不能自动触发完成。

通过feedkeys()函数,可以发送任意键"as if typed"。这允许您启动插入模式 触发完成:

function! InsertImport()
    call feedkeys("iimport \<C-R>=CompleteImport()\<CR>", 't')
endfunction
nnoremap <Leader>ji :call InsertImport()<CR>

PS: You should use :noremap 也用于普通模式映射;它使映射不受重新映射和递归的影响。