我有omnicppcomplete正常工作,除了偶尔它不会完成一些变量方法/成员。我终于厌倦了深入研究为什么,我相信原因是omnicppcomplete确实支持函数参数中的语法“Foo const& foo”。
例如,如果我将函数定义为:
int foo( Bar const & b ){
}
当我稍后输入“b。”时,我将无法获得完成信息。但是,如果我将签名更改为:
int foo( const Bar & b ){
}
当我输入“b。”时,我将能够获得完成信息。它似乎只是在函数参数列表中,因为我尝试使用签名“Bar const& bref”在函数中定义一个变量,并且我能够获得bref的完成信息。
如果这是omnicppcomplete的实际限制,我会感到惊讶;任何人都有任何关于这是否是一个bug和/或是否有解决方法的想法?改变编码风格似乎不是一个合理的解决方案。
答案 0 :(得分:4)
看起来像omnicppcomplete中的限制,但是我拉起了vim调试器并找到了它。
打开autoload / omni / cpp / utils.vim,转到第518行,应该是这样的:
for token in tokens
if state==0
if token.value=='>'
let parenGroup = token.group
let state=1
elseif token.kind == 'cppWord'
let szResult = token.value.szResult
let state=2
elseif index(['*', '&'], token.value)<0 "This is line 518
break
endif
并将该行更改为:
elseif token.value != 'const' && index(['*', '&'], token.value)<0
或者,这是执行它的vim命令=):
/index(\['\*', '&'],<CR>itoken.value != 'const' &&<ESC>:w
我会尝试将此提交给omnicppcomplete的维护者,但它有点像hackish,不知道它是否会进入。可能已经能够检查token.kind =='cppKeyword',但我想我“至少改变一方是错误的。
答案 1 :(得分:2)
在遇到omnicppcomplete问题后,我搜索了一个替代方案并找到了clang complete,它使用了clang的元数据输出(用于此类目的)。我的工作非常好,并提供了你的代码编译,它将了解一切。