vim kernel ctags cscope

vim - cscope o ctags ¿por qué elegir uno sobre el otro?



kernel (3)

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


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

La falta de precisión de los ctags es un problema ... y me parece que el cscope es mucho mejor para todos los macros relacionados (y hay un montón de macros en el kernel de Linux).

con respecto al uso, eso es realmente sencillo ... simplemente escribes 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 se basan en Ctrl- / (puedes reasignarlo si eres alérgico a Ctrl), principalmente usas s yg ....,

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

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


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

Si usa cscope, entonces 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 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.

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

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


ctags habilita dos funciones: le permite saltar de las llamadas a funciones a sus definiciones, y omni completar. La primera significa que cuando está por encima de una llamada a un método, al CTRL-] g] o CTRL-] saltará al lugar donde ese método está definido o implementado. La segunda característica significa que cuando 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, 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 uno sobre el otro? 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. Solo puede ejecutar :!ctags -R . g] simplemente funciona. También habilita esa cosa omni completa.

Cscope es ideal para bases de códigos más grandes y 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 :cscope blah blah teclas configurado; necesita ejecutar :cscope blah blah manualmente.

Para resolver el problema del puño, 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 forma puedo ejecutar ":! Cscope_gen.sh" en lugar de tener que recordar todos los pasos de configuración.

Asigné la búsqueda de cscope a ctrl-space x 2 con este fragmento, lo que mitiga el otro inconveniente de cscope:

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

Hay este complemento cscope_maps.vim que configura un grupo de enlaces similares. Nunca puedo recordar lo que significan todas las opciones, así que tiendo a pegarme a ctrl-space.

Entonces, 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.