omn​​icppcomplete不支持所有形式的const

时间:2011-04-28 18:31:10

标签: c++ vim omnicppcomplete

我有omnicppcomplete正常工作,除了偶尔它不会完成一些变量方法/成员。我终于厌倦了深入研究为什么,我相信原因是omnicppcomplete确实支持函数参数中的语法“Foo const& foo”。

例如,如果我将函数定义为:

int foo( Bar const & b ){
}

当我稍后输入“b。”时,我将无法获得完成信息。但是,如果我将签名更改为:

int foo( const Bar & b ){
}

当我输入“b。”时,我将能够获得完成信息。它似乎只是在函数参数列表中,因为我尝试使用签名“Bar const& bref”在函数中定义一个变量,并且我能够获得bref的完成信息。

如果这是omnicppcomplete的实际限制,我会感到惊讶;任何人都有任何关于这是否是一个bug和/或是否有解决方法的想法?改变编码风格似乎不是一个合理的解决方案。

2 个答案:

答案 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的元数据输出(用于此类目的)。我的工作非常好,并提供了你的代码编译,它将了解一切。