lunes, 8 de septiembre de 2014

Vim: ejecutar comandos el crear cierto tipo de archivos

La idea es esta: cada vez que vaya a crear un archivo .{cpp|h} quiero ejectuar algun comando/script desde vim. En este caso el comando es copiar un template de ycm (ycm_extra_conf.py) para programar en C++, y este archivo se deberá copiar en cada directorio que vaya a crear un nuevo codigo C++.

El procedimiento es sencillo una vez encontramos la manera, y simplemente debemos agregar esta linea a nuestro $HOME/.vimrc :
autocmd FileType cpp silent! !cp $HOME/devel/program/c/ycm/.ycm_extra_conf.py $(pwd) && notify-send "a copy of ycm was moved for C++ code to $(pwd)/"

Lo cual funciona como esperado, pero... cada vez que editemos/creemos un nuevo cpp en el mismo directorio, esa funcion *siempre* se ejecutará, lo cual copiará el mismo archivo y mostrará el mismo mensaje de forma repetitiva, cosa que se torna un bastante incomodo despues de cierto tiempo. Entonces lo mas conveniente es hacer una funcion que verifique si el archivo ycm ya existe en el directorio actual y si existe pues salimos, si no existe, lo copiamos.

La funcion en cuestión quedará de esta manera:
function! Ycm_check()
let file_path= getcwd()."/"
if filereadable(file_path.".ycm_extra_conf.py")
return
else
!cp $HOME/devel/program/c/ycm/.ycm_extra_conf.py $(pwd) && notify-send "a copy of ycm was moved for C++ code to $(pwd)/"
endif
endfunction

autocmd FileType cpp silent! call Ycm_check()

Un screenshot: