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

标签 vim autocomplete

问题

我想让 vim keyword 完成菜单显示它向我建议的函数的参数。 我希望它看起来像这样:

screenshot of vim omni completion using ctags

这是使用 ctags 的全方位补全,它很棒但速度很慢,所以我不能将它用于大型标签文件。

问题

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

screenshot of vim keyword completion using ctags

我的研究

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

但是我发现我可以获得一个显示我想要的信息的弹出菜单,但是使用我当前的配置(set completeopt=menuone,noinsert,popup)它只显示在 omni completion 中,还是太慢了。

最佳答案

我没有设法让 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

您只需按 <leader>?在普通模式下的函数名称上,您会看到一个漂亮的小弹出窗口,仅显示函数的原型(prototype)。

编辑:

当我使用 vim 完成时,我找到了一个解决方法来让它工作。

autocmd CompleteDone * execute "normal ^,?" | call feedkeys("\<esc>:autocmd! InsertLeave * ++once call popup_clear()\<cr>A")

只要你完成一个单词,这个自动命令就会弹出一个窗口,所以如果你输入 myImcompleteFunctionTag<c-]><c-y>
它将完成您的标记,然后打开弹出窗口,并在行尾让您处于插入模式。 autocmd 的其余部分会在您下次离开插入模式时关闭弹出窗口。

关于vim - 使vim关键字补全菜单显示函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63299580/

相关文章:

vim - 让 vim 移动 <{> <}> 以跳过折叠

bash - 在 bash 脚本中读取和制表符完成目录名称

autocomplete - 如何阻止 Notepad++ 显示文件中所有单词的自动完成功能

javascript - 为什么我无法使用 jQuery Autocomplete 访问 VALUE 或 DATA?

vim - 覆盖插件的重新映射?

haskell - Vim 有什么好的 Haskell 缩进脚本吗?

javascript - 带有 json 的 Jquery 自动完成失败

CSS 自动完成字体大小

vim - 为什么我需要在这个 vim 错误格式中进行额外的转义?

vim - 将行范围分配给 vimscript 中的变量