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.