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

Neg*_*_EV 6 c++ vim omnicppcomplete

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

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

int foo( Bar const & b ){
}
Run Code Online (Sandbox Code Playgroud)

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

int foo( const Bar & b ){
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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
Run Code Online (Sandbox Code Playgroud)

并将该行更改为:

 elseif token.value != 'const' && index(['*', '&'], token.value)<0
Run Code Online (Sandbox Code Playgroud)

或者,这是执行此操作的 vim 命令 =):

/index(\['\*', '&'],<CR>itoken.value != 'const' &&<ESC>:w
Run Code Online (Sandbox Code Playgroud)

我会尝试将其提交给omnicppcomplete的维护者,但这有点黑客,不知道它是否会进入。也许能够检查token.kind =='cppKeyword',但我想我会犯错站在改变最少的一边。