cscope o ctags ¿por qué elegir uno sobre el otro? [cerrado]


130

Principalmente uso vim / gvim como editor y estoy buscando usar una combinación de lxr (la referencia cruzada de Linux) y cscope o ctags para explorar la fuente del núcleo. Sin embargo, nunca he usado cscope o ctags y me gustaría saber por qué uno podría elegir uno sobre el otro teniendo en cuenta mi uso de vim como editor principal.

Respuestas:


156

ctags habilita dos características: permitiéndole saltar de llamadas a funciones a sus definiciones, y omni finalización. El primero significa que cuando finaliza una llamada a un método, al presionar g]o CTRL-]saltará al lugar donde se define o implementa ese método. La segunda característica significa que cuando escribe foo.o foo->, y si foo es una estructura, se mostrará un menú emergente con finalización de campo.

cscope también tiene la primera característica, usar set cscopetag, pero no la última. Sin embargo, cscope también agrega la capacidad de saltar a cualquiera de los lugares donde también se llama una función.

Entonces, en lo que respecta a saltar alrededor de una base de código, ctags solo lo guiará hacia el lugar donde se implementa la función, mientras que cscope puede mostrarle dónde se llama una función también.

¿Por qué elegirías uno sobre el otro? Bueno, yo uso ambos. ctags es más fácil de configurar, más rápido de ejecutar y si solo te importa saltar de una manera, te mostrará menos líneas. Puedes correr :!ctags -R .y g]simplemente funciona. También permite esa cosa omni completa.

Cscope es ideal para bases de código más grandes y desconocidas. La configuración es difícil porque cscope necesita un archivo que contenga una lista de nombres de archivos para analizar. También en vim, de forma predeterminada, no hay ninguna combinación de teclas configurada; debe ejecutarse :cscope blah blahmanualmente.

Para resolver el primer problema, tengo un script bash cscope_gen.shque se ve así:

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

Esto busca el código que me interesa, crea la lista cscope.files y crea la base de datos. De esa manera puedo ejecutar ":! Cscope_gen.sh" en lugar de tener que recordar todos los pasos de configuración.

Mapeo la búsqueda de cscope a ctrl-space x 2 con este fragmento, que mitiga el otro elemento negativo de cscope:

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

Existe este complemento cscope_maps.vim que configura un montón de enlaces similares. Nunca puedo recordar lo que significan todas las opciones, por lo que tienden a ceñirse al espacio de control.

Para concluir: ctags es más fácil de configurar y funciona principalmente sin hacer mucho más, también es vital para omni-complete. cscope proporciona más funciones si tiene que mantener una base de código grande y en su mayoría desconocida, pero requiere más trabajo de piernas.


2
¿Hay alguna manera de hacer que los ctags sean más precisos? Lo hice make tagsen el directorio raíz del núcleo y he estado jugando saltando y la mayoría de las veces termino en el lugar equivocado. Leí que ctags tiene problemas con el preprocesador c, pero teniendo en cuenta que ctags se usa en lxr, obviamente debe haber algo que se pueda hacer.
Robert S. Barnes

2
Si hay un profundo vudú macro, entonces ctags probable que no :-( lo uso sobre todo para la materia de C ++, que se basa menos en ese lado de las cosas (aunque eso tiene sus propios problemas ...)
richq

12
set cscopetag( cst) para hacer que los comandos :tagy CTRL-]busquen primero a través de cscope, luego
etiquete

1
Además, ctags es bastante lento en la búsqueda recursiva, el uso de "ctags -L cscope.files" acelerará significativamente la generación de etiquetas.
Aaron H.

1
@ RobertS.Barnes está utilizando algún tipo de solución g C-], vim le mostrará la lista de etiquetas que coinciden con el nombre. Aún necesitará encontrar la definición adecuada que está buscando manualmente.
Hubert Kario

15

Estuve en la misma situación hace unos meses ...

La falta de precisión de ctags es una molestia en ... y encuentro que cscope es mucho mejor para todas las cosas relacionadas con macros (y hay un montón de macros en el kernel de Linux) ...

con respecto al uso, eso es realmente sencillo ... simplemente escribe cscope -R en la raíz de su núcleo y luego no tiene nada de qué preocuparse ... (Quiero decir, si solo quiere explorar, eso es perfecto ...)

Luego, las combinaciones de teclas se basan en Ctrl- \ (puede reasignarlo si es alérgico a Ctrl), principalmente usa syg ....

Desarrollando para el núcleo, no necesitaba tanto la finalización ...

De todos modos, vaya a cscope, esto es mucho más conveniente y preciso.


44
<< simplemente escriba cscope -R en la raíz de su kernel ... Es mejor escribir "make cscope" debajo del kernel, de lo contrario, terminará con todas las arquitecturas presentes en el kernel de Linux y, por lo tanto, definición múltiple al mismo símbolo C.
kumar

4

Hmm ... Probablemente deberías usar etags en lugar de ctags ...

Si usa cscope, puede ver cadenas de llamadas, es decir, ¿quién llama a esta función y a qué funciones llama esta función?

No estoy seguro de si esto se puede hacer usando etags / ctags ...

Esa es solo una característica ... ¿qué hay de encontrar el archivo que contiene una definición de función particular? Esto solo se obtiene en cscope.

Yo uso tanto cscope y etags, ambos son buenos para diferentes cosas, sobre todo cuando se trabaja con una gran base de código, como el núcleo de Linux. De hecho, comencé a usar cscope y etags cuando comencé a trabajar con Linux Kernel / Xen.

LXR no es excelente, porque tiene que hacer clic, ir a través de la red, etc., mientras que puede construir las bases de datos cscope y tags en su código de kernel y no tiene que ir a través de la red (a diferencia de lxr).


¿No es etags solo para emacs? Yo uso g / vim exclusivamente.
Robert S. Barnes

Sí, tiene usted razón. Desde la página del manual: El programa etags se usa para crear un archivo de tabla de etiquetas, en un formato que entiende emacs (1); El programa ctags se utiliza para crear una tabla similar en un formato entendido por vi (1).
rmk

1
Hay dos sabores de etags y ctags, creo. Uno es el emacs uno, el otro es el exuberante ctags uno. El primero se escribió primero para emacs, pero también se puede usar para vi; el segundo se escribió primero para vi, pero también se puede usar para emacs. Encuentro el segundo (etiquetas exuberantes) más fácil de usar, aunque soy un usuario de emacs. Si instala el paquete exuberant-ctags, los enlaces a los binarios etags / ctags cambiarán y apuntarán a diferentes binarios.
Ustun

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.