miércoles, 11 de octubre de 2006

Vim, ese semidiós (primera parte)

Hoy voy a hablar de vim (la versión mejorada de vi). vim tiene todo lo bueno de vi, pero además permite una serie de extensiones, plugins y macros que quitan el aliento. En otra ocasión os hablaré de los plugins y os recomendaré alguno. Mientras podéis disfrutar de todo sobre vim en el enlace

http://www.vim.org

En este post os hablaré del fichero de configuración .vimrc que se encuentra en vuestro directorio $HOME

Este fichero permite incluir una serie parámetros y opciones que se cargan en vim en el momento de arranque.

A continuación os detallo algunas líneas de mi fichero .vimrc que os
pueden ser de utilidad

" Los comentarios van precedidos por unas comillas
" La siguiente línea cambia el tamaño por defecto del tabulador a 3
set tabstop=3

" mantiene 50 líneas de historia de comandos en una sesión vim
set history=50

Y ahora mi parte favorita, los "mapeos" de teclas a comandos.

" Los tres siguientes permite usar el comando externo 'par' que
" viene con casi todas las distribuciones linux (salvo Suse) e incluso
" con cygwin y que permite manipular párrafos de texto
" El siguiente simplemente toma un párrafo (considerando párrafo hasta
" las siguiente línea vacía) y lo ajusta a 78 columnas simplemente pulsando
" F3
map !}par -w78
" El siguiente hace lo mismo pero para un selección hecha en
" modo visual (con el comando v), de ahí la v de 'vmap'
vmap !par -w78
" Por último, pulsando F4 ajusta el texto a 78 columnas indentando por
" los dos extremos (añadiendo espacios si fuese necesario)
map !}par -j1 -w78

" imap hace referencia a comandos en modo 'insertar'. El siguiente
" comando ayuda a escribir textos en LaTex. Si escribes la palabra
" itemize y pulsas (en modo insertar) F4 te crea el begin y end
" correspondientes.
imap bi\begin{$a}yypwdwiendO

" Y ya que estamos con Latex, aquí tenéis algo cómodo
" F5 guarda el fichero actual y lo compila
map :w!:!latex %
" F6 invoca al comando xdvi
map :!xdvi %<.dvi&
" F7 crea el postscript correspondiente (en compatibilidad PDF) y llama
" al programa "gv"
map :!dvips -P pdf -G0 %<.dvi >& /dev/null :!gv %<.ps &
" Por último, F8 crea un pdf y llama al comando xpdf
map :!ps2pdf %<.ps:!xpdf -z page %<.pdf &

Para finalizar, os hablaré de los pliegues o 'folds'. Son agrupaciones de varias líneas en una única línea que se despliega con un comando. Para más información sobre los pliegues podeís poner (dentro de vim) :help folds.

Yo uso los pliegues cuando escribo un código en C++ o un documento en LaTex muy grande. Para C++, lo que me interesa es que todas las estructuras, clases y subrutinas se compacten. De este modo un código con 6 clases, 14 funciones y la función main, se reduce a la parte de los includes, las variables globables y 21 pliegues, lo cual cabe casi en la ventana de edición por lo que puedo echar un vistazo muy rápido al código completo.

Para manejar los pliegues en un código C++, bastaría con añadir a .vimrc:


map F za
map :set foldmarker=\{,\} :set foldmethod=marker



El primer mapeo permite conmutar entre abierto y cerrado cuando estamos situados sobre un pliegue pulsado F (en modo comando, se entiende). La segunda línea somplemente crea los pliegues al pulsar shift-F12.

Para LaTex, podríamos hacer, por ejemplo:


map :set foldmarker=\\begin,\\end :set foldmethod=marker