VIM con ctags
Como muchos sabréis. una de las maneras autocompletar código, saltar a la definición… Es usando vim con ctags, una aplicación que genera un archivo de etiquetas para guardar todas las definiciones dentro de tu código.
Esto implica que deberíamos actualizar las etiquetas cada vez que generemos el código. Esto lo podemos solventar de manera sencilla configurando en nuestro .vimrc que ejecute el comando cada vez que guardemos el buffer pero… Para proyectos con muchos archivos, como los que están basados en frameworks php como symfony o laravel, lleva un tiempo parsear todos lo ficheros, con lo que el vim se quedará un rato en espera cuando guardemos.
Podemos solucionar esto gracias a que a partir de la versión 8 de vim podemos ejecutar tareas de manera asíncrona.
Generación de ctags de manera asíncrona
A continuación os dejo un ejemplo de función para generar las etiquetas en background, comprobando primero que tenemos una versión de vim superior a la 8 y que la tarea no está ya ejecutándose, y su función de callback para mostrar que la generación de etiquetas a finalizado.
function! GenerateTagsCallback(channel) unlet g:generateTagsOutput echo 'Tags generated!' endfunction function! GenerateTags() if v:version < 800 echoerr 'Requires VIM version 8 or higher' return endif if exists('g:generateTagsOutput') echo 'Already running task in background' else execute "silent !rm -f .git/tags" let g:generateTagsOutput = tempname() let command = printf('ctags --options=%s/dotfiles/vim/ctags.cnf', $HOME) call job_start(command, {'close_cb': 'GenerateTagsCallback', 'out_io': 'file', 'out_name':g:generateTagsOutput}) endif endfunction
Os dejo también la configuración de ctags que uso para quenerar las etiquetas en PHP. Como podréis ver guardo el fichero de tags dentro de la carpeta .git para se excluya del repositorio.
-f .git/tags --recurse --fields=afikmsS --languages=php --exclude=.git --tag-relative=yes
Exuberant ctags vs Universal ctags
Indagando en la generación de tags, descubrí que el proyecto exuberant ctags, que ya actualizaba al original ctags, ha dejado de ser mantenido desde 2009 por lo que no añade los cambios de sintaxis que se han ido produciendo desde entonces, como los introducidos en PHP 7. Por suerte universal ctags continua y mantiene las sintaxis de manera activa.
Os dejo como sustituir exuberant ctags por universal ctags en ubuntu.
sudo apt-get remove exuberant-ctags git clone https://github.com/universal-ctags/ctags.git cd ctags ./autogen.sh ./configure make sudo make install
Podéis consultar mi configuración completa de vim en github: