6

我的omnicppcomplete工作正常,除了偶尔它不会完成一些变量方法/成员。我终于恼火地探究了原因,我相信原因是omnicppcomplete确实支持函数参数中的语法“Foo const & foo”。

例如,如果我有一个函数定义为:

int foo( Bar const & b ){
}

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

int foo( const Bar & b ){
}

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

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

4

2 回答 2

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',但我想我会犯错在改变最少的一边。

于 2011-06-24T03:26:43.237 回答
2

在经历了omnicppcomplete的问题后,我搜索了一个替代方案,发现使用clang的元数据输出的clang complete(用于此类目的)。我工作得非常好,只要你的代码编译,它就会理解一切。

于 2011-05-18T13:57:19.360 回答