是否可以让 Vim 的omnicppcomplete 自动关闭不带任何参数的函数或方法的参数列表?
例如,假设v
是一个 STL 向量,当自动完成时v.clear()
,我们最终得到:
v.clear(
如果自动添加右括号会很好。这可能吗?
是否可以让 Vim 的omnicppcomplete 自动关闭不带任何参数的函数或方法的参数列表?
例如,假设v
是一个 STL 向量,当自动完成时v.clear()
,我们最终得到:
v.clear(
如果自动添加右括号会很好。这可能吗?
看起来应该是可能的:我不确定我是否有最新版本的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 in my version) 行之后let szItemWord .= '('
,添加:
if (has_key(tagItem, 'signature') == 0) || (tagItem['signature'] =~ '()')
let szItemWord .= ')'
endif
这应该可以解决问题(尽管我不怎么使用 C++,所以我没有对它进行广泛的测试)。它基本上检查函数的“签名”是否包含“ ()
”而不是(例如)“ (int *major, int *minor)
”。如果括号为空,则添加右括号。
它可能会通过更改'()'
为来改进'(\s*\(void\)\?\s*)'
完整性:这将检查“ ()
”、“ ( )
”、“ (void)
”、“ ( void )
”等。
我只是替换第 165 行:
let szItemWord .= '('
和
let szItemWord .= tagItem['signature']
这样我在代码中得到了整个原型而不是函数名,然后我一个一个地替换了参数。