2009-06-01 17 views
118

Uso principalmente vim/gvim como editor y estoy usando una combinación de lxr (the Linux Cross Reference) y cscope o ctags para explorar la fuente del kernel. 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.cscope o ctags ¿por qué elegir uno sobre el otro?

+0

Votación para cerrar como demasiado amplia, como la mayoría de las preguntas de la herramienta A frente a la herramienta B. –

+5

@CiroSantilli 胡海峰 事件 胡海峰 胡海峰 胡海峰 Está bromeando, ¿verdad? –

+0

Creo que es el consenso general: http://meta.stackexchange.com/questions/222060/modify-the-recommend-a-tool-close-reason-to-also-forbid-comparison-questions || http://meta.stackexchange.com/questions/211269/why-stackoverflow-doesnt-allow-comparison-questions-or-recommendations-for-tool || http://stackoverflow.com/questions/20537271/pros-and-cons-of-calabash-ios Por supuesto, no dude en impugnarlo, puedo estar equivocado. –

Respuesta

136

ctags habilita dos funciones: le permite saltar de las llamadas a funciones a sus definiciones, y omni completar. La primera significa que cuando está sobre una llamada a un método, al presionar g] o CTRL-] se saltará al lugar donde se define o implementa dicho 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 la finalización del campo.

cscope también tiene la primera característica - usando 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 a una función.

Por lo tanto, en lo que respecta a saltarse una base de código, los ctags solo lo llevarán al lugar donde se implementa la función, mientras que cscope puede mostrarle dónde se llama también una función.

¿Por qué elegirías una sobre la otra? Bueno, 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. Simplemente puede ejecutar :!ctags -R . y g] simplemente funciona. También habilita esa cosa omni completa.

Cscope es ideal para bases de códigos grandes, desconocidas. La configuración es un problema porque cscope necesita un archivo que contenga una lista de nombres de archivos para analizar. También en vim, de forma predeterminada no hay ningún enlace de teclas configurado; debe ejecutar :cscope blah blah manualmente.

para resolver el problema puño Tengo una escritura del golpe cscope_gen.sh que tiene este aspecto:

#!/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 para el código que me interesa, crea la lista cscope.files y crea la base de datos . De esa forma puedo ejecutar ":! Cscope_gen.sh" en lugar de tener que recordar todos los pasos de configuración.

I Mapa de la búsqueda cscope a Ctrl-espacio x 2 con este fragmento, lo que mitiga la otra decepción de cscope:

nmap <[email protected]><[email protected]> :cs find s <C-R>=expand("<cword>")<CR><CR> 

Hay this cscope_maps.vim plugin que pone en marcha un grupo de fijaciones similares. Nunca puedo recordar lo que significan todas las opciones, así que tiendo a pegarme a ctrl-space.

Por lo tanto, para concluir: ctags es más fácil de configurar y funciona principalmente sin hacer mucho más, es vital para omni-completar también. cscope proporciona más características si tiene que mantener una base de código grande y en su mayoría desconocida, pero requiere más trabajo de la pierna.

+2

¿Hay alguna forma de hacer que los ctags sean más precisos? Hice 'make tags' en el directorio raíz del kernel y he estado jugando con saltos y la mayoría del tiempo termina 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. –

+2

Si hay macro vudú profundo, entonces ctags probablemente fallará :-(Lo uso principalmente para C++ cosas, que se basa menos en ese lado de las cosas (aunque eso tiene sus propios problemas ...) – richq

+0

Estoy totalmente de acuerdo con eso. .. el kernel de Linux está lleno de macros y ctags raros ... es por eso que cambié hacia cscope – LB40

13

yo estaba en la misma situación de hace algunos meses ...

La falta de precisión de ctags es un dolor en un .., y me encuentro con cscope mucho mejor para todas las macros cosas relacionadas (y hay un montón de macros en el núcleo de Linux) ..

en cuanto al uso, eso es realmente sencillo ... simplemente escribe cscope -R en la raíz de tu kernel y entonces no tienes nada de qué preocuparte .. (Quiero decir si solo quieres explorar eso es perfecto ...)

Entonces, las asociaciones de teclas están todos basados ​​en Ctrl \ (puede volver a asignar si usted es alérgico a Ctrl), se utiliza sobre todo s y G ....,

desarrollo para el núcleo , No necesitaba tanto la finalización ...

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

+3

<< simplemente escribes cscope -R en la raíz de tu núcleo ... Mejor para escribir "make cscope" en kernel, de lo contrario terminará con todas las arquitecturas presentes en el kernel de Linux y, por lo tanto, tendrá una definición múltiple con el mismo símbolo de C. – kumar

4

Hmm ... Probablemente debería utilizar etags en lugar de ctags ...

Si utiliza cscope, a continuación, se puede ver cadenas de llamadas, es decir, que llama a esta función & que funciona hace esta llamada de función?

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

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

Yo uso ambos cscope y etags, ambos son buenos para cosas diferentes, especialmente 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 muy grande, porque hay que hacer clic, ir a través de la red, etc., mientras que usted puede construir las bases de datos cscope etiquetas y de código del núcleo y no tiene que ir a través de la red (a diferencia de LXR) .

+0

¿No son los etags solo para emacs? Yo uso g/vim exclusivamente. –

+0

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

+1

Creo que hay dos sabores de etags y ctags. Uno es el de emacs, el otro es el ctags exuberante. El primero se escribió primero para emacs, pero también se puede usar para vi; el segundo fue escrito primero para vi, pero también se puede usar para emacs. Encuentro el segundo (ctags exuberantes) más fácil de usar, aunque soy un usuario de emacs. Si instala el paquete exuberant-ctags, los enlaces a los binarios de etags/ctags cambiarán y señalarán diferentes binarios. – ustun

Cuestiones relacionadas