让vim关键字补全菜单显示函数参数

3

问题

我想让vim的关键字自动完成菜单显示函数的参数。 我希望它看起来像这样:

使用ctags的vim omni completion的屏幕截图

这是使用ctags的omni-completion,很棒但速度太慢了,所以我不能在大型标签文件上使用它。

问题

这是我目前使用ctags的关键字完成(set complete=t)的样子:

使用ctags的vim关键字自动完成的屏幕截图

我的研究

我试图查看vim的文档 (ins-completion、'complete'、'completeopt'、'completefunc'、'omnifunc'、'ft-c-omni'),但实现我的目标的唯一方法似乎是编写自己的'completefunc',而我不想这样做。

然而,我发现可以获取一个弹出菜单来显示我想要的信息,但使用我的当前设置 (set completeopt=menuone,noinsert,popup) 它只会在omni-completion中显示,这又太慢了。


你尝试过YouCompleteMe插件吗?它在大型项目上运行非常快,显示签名等等。https://github.com/ycm-core/YouCompleteMe - Dmitry
我知道YouCompleteMe,但我从未尝试过它,事实上我从未使用过任何插件,我喜欢在vim中以DIY的方式完成事情,并且我更喜欢极简主义而不是插件,尽管我承认这不是一种聪明或高效的做事方式。我找到了一个解决方法来实现我的目标,但它并不是完美的解决方案,我将发布一个答案来展示它。 - matt
更少的插件 - 更快的 Vim,这是真的,尤其是对于慢电脑来说。只需记住,您有这样的选择。 - Dmitry
1个回答

1

我无法使vim关键字完成按照我的意愿工作,因此我浏览了vim文档(:h tag,popup,popup_atcursor),并得出结论:创建自己的简单弹出窗口应该可以解决问题。

代码

" get the parameters of a function and put it in a popup using ctags
func GetFuncParamsFromTag()
    silent write
    " jump to tag under cursor
    silent execute "normal \<c-]>"
    " if there is '(' on the same line, it may be a function
    if search('(', "n") == winsaveview()["lnum"]
        " yank the function's name and parameters
        silent execute "normal v/)\<cr>y\<c-t>"
        " remove any previously present popup
        call popup_clear()
        " make the popup spawn above/below the cursor
        call popup_atcursor(getreg('0'), #{moved: [0, 80], highlight: 'WildMenu'})
    endif
endfunc

nnoremap <silent> <leader>? :call GetFuncParamsFromTag()<cr>

预览

它看起来像这样:

screenshot

在 Normal 模式下,只需按下函数名称上的 <leader>?,您就会得到一个漂亮的小弹窗,显示该函数的原型。
编辑:
我找到了一个解决方法,可以在使用 vim 自动完成时使其正常工作。
autocmd CompleteDone * execute "normal ^,?" | call feedkeys("\<esc>:autocmd! InsertLeave * ++once call popup_clear()\<cr>A")

这个自动命令会在你完成一个单词时弹出一个弹窗,所以如果你输入myImcompleteFunctionTag<c-]><c-y>,它会自动补全你的标签,然后打开弹窗,并让你保持插入模式在行末。其余部分会在你下次离开插入模式时关闭弹窗。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接