2011-04-28 6 views
6

Tengo omnicppcomplete funciona bien, excepto que de vez en cuando no completará algunas de las variables métodos/miembros. Finalmente me molestó lo suficiente como para investigar por qué y creo que la razón es que omnicppcomplete admite la sintaxis "Foo const & foo" en los argumentos de la función.omnicppcomplete no admite todas las formas de const

Por ejemplo, si tengo una función definida como:

int foo(Bar const & b){ 
} 

no voy a ser capaz de obtener información de finalización cuando más tarde de tipo "B".. Sin embargo, si cambio la firma a:

int foo(const Bar & b){ 
} 

Podré obtener información de finalización cuando escribo "b.". Parece estar solo en las listas de argumentos de funciones porque traté simplemente de definir una variable dentro de la función con la firma "Bar const & bref" y pude obtener información de finalización para bref.

Me sorprendería si esto es una limitación real de omnicppcomplete; ¿Alguien tiene alguna idea sobre si esto es un error y/o si hay una solución para ello? Cambiar el estilo de codificación no parece una solución razonable.

+0

Guau, ¡eso es cojo! Especialmente dado que el primero es la sintaxis más consistente (aunque, por supuesto, el último no es menos correcto, estrictamente hablando). –

Respuesta

3

Parece una limitación en omnicppcomplete, pero saqué el depurador de vim y lo encontré.

Abran carga automática/omni/CPP/utils.vim, vaya a la línea 518, debería tener este aspecto:

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 

y cambiar esa línea a:

elseif token.value != 'const' && index(['*', '&'], token.value)<0 

O, aquí está la vim comandos para hacerlo =):

/index(\['\*', '&'],<CR>itoken.value != 'const' &&<ESC>:w 

voy a tratar de enviar este al encargado de omnicppcomplete, pero es tipo de hacker, no sé si entrará. Pudo haber podido comprobar si token.kind == 'cppKeyword', pero pensé que me equivocaría si cambiaba lo menos posible.

+0

Muchas gracias, había perdido la esperanza de que alguien respondiera. En una nota sin relación, la recompensa te atrajo a mirar de alguna manera. Nunca pensé que la recompensa fuera útil; esta es la primera vez que funcionó. Solo más por mi curiosidad. –

+0

No creo que la recompensa realmente me importara mucho, pero sí hizo que la pregunta apareciera en la lista de preguntas destacadas para C++, que es donde yo la vi. Sin embargo, es un buen beneficio. =) Gracias! – Xepo

2

Al haber tenido problemas con omnicppcomplete, busqué una alternativa y encontré clang complete que usa la salida de metadatos de clang (que está destinada a tales fines). Trabajo extremadamente bien y siempre que compile su código, lo entenderá todo.

+0

Sí, vi el clang completo, pero desafortunadamente no tengo acceso al clang en todos mis servidores de desarrollo ... –

Cuestiones relacionadas