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 blah
manualmente.
Para resolver el primer problema, tengo un script bash cscope_gen.sh
que 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.
make tags
en 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.cscopetag
(cst
) para hacer que los comandos:tag
yCTRL-]
busquen primero a través de cscope, luegog 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.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.
fuente
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).
fuente
Sugiera usar gtags globales. Podría usar el complemento vim gen_tags para integrar gtags con vim.
fuente