vim ctags

vim - ¿Hay alguna alternativa a los ctags que funcione mejor?



(5)

Acabo de descubrir el plugin de taglist para vim, y leí sobre cómo usarlo con ctags .

Sin embargo, decepcionantemente ctags es un analizador muy simple.

¿Hay alguna alternativa más completa?

Específicamente, estoy buscando algo que:

  • expande macros de estilo #define(x, y) x ## y para declaraciones de funciones

  • procesos #include declaraciones

  • permite incluir rutas de acceso para dependencias

Veo que clang proporciona una API aptas para acceder al c AST, así que seguramente esto no es muy difícil de hacer.

¿Alguien ya lo ha hecho?

-

Editar:

Estos no lo cortan:

  • clang_indexer - No compila; cuando lo hace (después de la piratería), no funciona (errores sin fin).

  • clang_complete - No parece ser mejor que ctags. Sin recomendaciones específicas de contexto, sin finalización de estructura, sin argumentos de función, sin expansión de macro; solo una lista de símbolos y el archivo del que provienen.


He pasado bastante tiempo luchando con esto yo mismo.

Lo más cercano que he tenido fue algo llamado gccsense . Desafortunadamente, el proyecto parece abandonado y, además, fue difícil configurarlo porque el inglés no era el primer idioma del autor.

Terminé acercándome al problema desde otro ángulo. Tomé la decisión de que intellisense / autocomplete era más importante para mi codificación que tener todas las funciones disponibles de vim, así que elegí un IDE como Eclipse, y luego encontré un complemento para Eclipse que emula a Vim. Hasta el momento, el mejor tipo de complemento que he encontrado es Viable .

Aquí está la lista completa de opciones que he probado y encontrado insatisfactorias:

  • clang: requiere cambiar de gcc a un compilador diferente y "mejor". El problema es que gcc es mucho más maduro [parece que no es necesario cambiar los compiladores para ver los comentarios a continuación, puedo intentarlo de nuevo en el futuro].
  • gccsense: excelente idea (usar gcc para darle el código completo); sin embargo, se abandona el trabajo en el proyecto :( y la versión que está arriba es de calidad beta
  • xref in vim - xref es una gran herramienta independiente y funciona muy bien para analizar C. Se puede hacer que funcione en vim con vxref , sin embargo, desde mi experiencia, xref carece de analizar el código C ++ actual y el desarrollo se ha detenido (así como el desarrollo en vxref)
  • eclim: parece funcionar muy bien para el soporte de Java usando eclipse, extremadamente lento y completamente poco fiable al analizar código C ++ o C. Lo que generalmente ocurre es que todo funciona durante un tiempo prolongado, pero de repente, el analizador deja de analizar cualquier código nuevo que usted escriba, y nada menos que cargarse eclipse y forzar el eclipse para volver a analizar el proyecto parece ayudar. Además, un hecho menos importante, pero más molesto es que eclim se encarga de los errores de manejo, por lo que daña la forma en que vim normalmente analiza los errores de gcc, lo que significa que no tienes acceso a la lista de arreglos rápidos que es molesto.
  • netbeans + jvi - muchas personas juran por esto, pero tuve todo tipo de problemas con jvi. Un problema importante que tuve fue que jvi diría que estoy en modo normal, pero realmente estaba en modo insertar, nada menos que un reinicio me ayudaría.
  • eclipse + viplugin / vrapper - esto comenzaba a parecerse a la mejor opción; cada uno tenía su propio conjunto de errores + características que carecían, pero aún así era más atractivo, hasta que encontré viable que parecía ser el más estable y tener la mayoría de las características.

Si encuentra una solución con la que está contento, por favor compártalo en un comentario, porque me interesaría.


Todavía no lo he probado, pero clang_indexer parece muy clang_indexer a lo que estás buscando ( sources ). Todavía usa una base de datos externa (es decir, no indexa sobre la marcha per se), pero parece ofrecer una funcionalidad que normalmente solo se encuentra en cscope (que no es compatible con C ++ demasiado bien).

Para autocompletar utilizo clang_complete . No requiere generar un índice y funciona bastante bien. También puede realizar la comprobación de sintaxis automática en vim, de modo que se advierte sobre posibles problemas. No autocompleta el ejemplo macro que le diste

#define blah(x) blah__ ## x void blah_<TAB>

aunque bla__x (solo como blah(x) ). Sería bueno que esto fuera más configurable, pero tampoco lo consideraría roto.


Una posibilidad es usar Eclim . Es una herramienta poderosa que se puede usar de muchas maneras; en su caso, tendría que iniciar un servidor Eclipse sin cabeza y básicamente usar el indexador de Eclipse, etc. Sin embargo, creo que necesita tener su proyecto registrado como un proyecto de Eclipse.


Yo uso el global '' global ''. Después de instalarlo, tiene el comando ''global'' para buscar su código y ''gtags'' para indexar.

Trabajo con kernel de Linux y me ayuda mucho: funciona con define más inteligente (pero aún no tan bueno como yo lo quiero) y conoce el prototipo de función, la implementación de funciones y todas las referencias a la función desde el código.

También es posible integrar ''global'' con VIM, hay un complemento para él :

Buena suerte.


CScout versión 2.8 ofrece una opción de línea de comandos (-C) que creará un archivo de etiquetas compatible con vim para el código fuente C que procesará. CScout es un analizador de código fuente y navegador de refactorización para colecciones de programas C. Puede procesar espacios de trabajo de múltiples proyectos mapeando la complejidad introducida por el preprocesador C en los archivos originales de código fuente C. En consecuencia, el archivo de etiquetas generado contiene información correcta para entidades, como funciones, variables y estructuras, que se crean a través de macros de preprocesador. CScout procesará los archivos de inclusión, utilizando las rutas de archivos de inclusión especificadas en el archivo de configuración del proyecto del código (el equivalente de un archivo Makefile). Para probarlo, descargue el paquete que coincida con su configuración, vaya al directorio de ejemplo que contiene el código fuente awk y ejecute

../bin/cscout -Cc awk.cs

Puede ver algunos tipos de construcciones de preprocesador que CScout puede manejar en esta página . Por ejemplo, si procesa el siguiente código

#define typefun(name, type, op) / type type ## _ ## name(type a, type b) { return a op b; } typefun(add, int, +) typefun(sub, int, -) typefun(mul, int, *) typefun(div, int, /) typefun(add, double, +) typefun(sub, double, -) typefun(mul, double, *) typefun(div, double, /) main() { printf("%d/n", int_add(5, 4)); printf("%g/n", double_mul(3.14, 2.0)); }

CScout generará un archivo de etiquetas con las siguientes entradas.

double_add test.c 8 ;" f double_div test.c 11 ;" f double_mul test.c 10 ;" f double_sub test.c 9 ;" f int_add test.c 4 ;" f int_div test.c 7 ;" f int_mul test.c 6 ;" f int_sub test.c 5 ;" f main test.c 13 ;" f typefun test.c 1 ;" d

Puede probarlo usted mismo agregando unas pocas macros generadoras de código en el código fuente de ejemplo para ver las etiquetas que creará CScout .