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:

https://github.com/rtorralba/dotfiles

Load more

Raül Torralba Adsuara

Software developer, organizer at @betabeersCAS, vim lover and artansoft's blogger.

rtorralba raul_torralba


Published