2011-09-12 17 views
9

Dado el siguiente código:¿Se pueden saltar ctags de tipo inferido en vim?

// MyClass.h 
class A { 
    void foo(); 
} 

class B { 
    void foo(); 
} 

// MyClass.cpp 
void main() { 
    A a(); 
    a.foo(); 
} 

Dado que yo estoy usando vim y tengo mis ctags generan, si pongo mi cursor sobre el foo() en main() y golpean ctrl+], voy a obtener una lista de las implementaciones de foo , ya que hay más de uno. Si hubiera solo uno, saltaría inmediatamente a esa implementación.

¿Hay alguna manera en vim para el tipo de a que se infieren de tal manera que cuando golpeo ctrl+], salta inmediatamente a la aplicación de A::foo() lugar de suministro de mí con una lista de opciones? Parece que ese complemento debería existir y no puedo encontrarlo.

Actualización: Parece que actualmente no hay solución a este problema, por lo que he seleccionado la respuesta de exclipy a continuación. En caso de presentarse una solución y una nueva respuesta, actualizaré la respuesta a esta pregunta.

+0

No he visto nada que permita esto. Puede ser posible a través de un plugin basado en scripts para Python. No estoy seguro, así que no dejaré una respuesta – Daenyth

+0

Podría haber estado imaginando cosas, pero para el código C tuve la impresión de que esto de alguna manera funcionó (tal vez porque los archivos de etiquetas locales se buscan antes que otros, tal vez porque puede seleccionar etiquetas basadas en la proximidad)? De todos modos, leo ': tnext' y con frecuencia lo asigno a una clave cuando navego por – sehe

Respuesta

4

Lo que quiere hacer no es posible a menos que Vim realmente pueda analizar la unidad completa de traducción C++, como haría un compilador C++. Esto está más allá del alcance de los ctags, que usa heurísticas muy simples para meramente tokenizar las proximidades del cursor.

Así que la solución obvia a esto es ... ¡conecte un analizador de C++ en Vim! En realidad, hay un complemento llamado clang_complete, que ya hace la mayor parte del trabajo pesado de enganche en el analizador Clang C++. A partir de esta base, debería ser una cuestión simple ampliarlo para utilizar la API de Clang para implementar salto a definición.

De hecho, he empezado a trabajar en esta característica, a través de dos proyectos: clang_indexer, que se arrastra el árbol de fuentes para crear un índice en el disco, y el tenedor de clang_complete, lo que añade la función de consultar el índice para usos del símbolo debajo del cursor. Esto es en realidad un poco más de lo que buscas porque estoy buscando una función de "encontrar todas las referencias" (con la opción de filtrar los resultados a solo definiciones).

Está en una etapa muy temprana y solo lo estoy haciendo por mí mismo, así que no espere que sea una solución muy pulida.

+0

Utilicé clang_complete.vim por Xavier Deguillard. Funciona perfectamente pero lo que quiero es saltar a la definición y encontrar todas las referencias. Es bueno leer que estás trabajando en eso. ¿Hay algún lugar CÓMO hacer que el trabajo sea tu clang_indexer y clang_complete juntos? Suena muy prometedor. Gracias. –

+0

http://blog.wuwon.id.au/2011/10/vim-plugin-for-navigating-c-with.html –

Cuestiones relacionadas