如何让omnicppcomplete自动关闭空参数列表?

时间:2009-11-29 13:24:16

标签: c++ vim omnicppcomplete

是否可以让Vim的omnicppcomplete自动关闭不带任何参数的函数或方法的参数列表?

例如,假设v是STL向量,当自动完成v.clear()时,我们最终得到:

v.clear(

如果自动添加右括号,那就太好了。这可能吗?

2 个答案:

答案 0 :(得分:3)

看起来它应该是可能的:我不确定我是否拥有omnicppcomplete脚本的最新版本,但在我的autoload/omni/cpp/complete.vim中,有一个名为s:ExtendTagItemToPopupItem的函数。在这个函数中,有:

" Formating information for the preview window
if index(['f', 'p'], tagItem.kind[0])>=0
    let szItemWord .= '('
    if g:OmniCpp_ShowPrototypeInAbbr && has_key(tagItem, 'signature')
        let szAbbr .= tagItem.signature
    else
        let szAbbr .= '('
    endif
endif

在该行(我的版本中为#165)let szItemWord .= '('之后,添加:

    if (has_key(tagItem, 'signature') == 0) || (tagItem['signature'] =~ '()')
        let szItemWord .= ')'
    endif

那个应该做的伎俩(虽然我不太多使用C ++,所以我没有对它进行过广泛的测试)。它基本上检查函数的“签名”是否包含“()”而不是(例如)“(int *major, int *minor)”。如果括号为空,则会添加一个右括号。

将完整性更改为'()''(\s*\(void\)\?\s*)'可能会有所改进:这会检查“()”,“( )”,“(void) “,”( void )“等等。

答案 1 :(得分:1)

我只是替换第165行:

let szItemWord .= '('

let szItemWord .= tagItem['signature']

这样我在代码中获取整个原型而不是函数名,然后我逐个替换参数。