nov 8 2010

Mi configuraciones de vim (y II)

tatai

Como segunda parte del primer post sobre configuraciones de vim, voy a describir qué tengo ahora mismo en mi ~/.vimrc y plugins que uso. Esta configuración “está viva” y la cambio de vez en cuando. ¿Por qué? Pues porque tus gustos varían de vez en cuando y porque siempre descubres cosas nuevas que vas añadiendo o mejorando.

He colgado en github mi configuración al completo basandome en lo explicado en el anterior post. Puedes verlo aquí: https://github.com/tatai/vim

Como acabo de comentar, es posible que lo que haya ahora, es diferente de lo que explique aquí.

~/.vimrc

Vayamos por partes y poco a poco. Pese a que todas las líneas están comentadas, añadiré lo que crea que puede aclarar tras cada trozo de código.

Aclarar que estas opciones son personales y que espero que sean una guía para decidir cómo es tú configuración. Sólo probando encontrarás la combinación perfecta.

Muchas de las opciones se dehabilitan poniendo “no” delante de la opción o se habilitan quitando ese mismo “no”, como por ejemplo se puede ver en la primera de las líneas, con “set nocompatible” que indica que no sea compatible y con “set compatible” se hace que sea compatible.

set nocompatible

Obligatorio, debes tenerla como tu primera opción en .vimrc puesto que el funcionamiento de interno de vim y de muchos plugins varía. Se obliga a que vim no sea compatible con el antiguo “vi”.

" Pathogen
call pathogen#runtime_append_all_bundles()
call pathogen#helptags()

Llamadas para inicializar Pathogen (ver el primer post)

" UTF-8 by default
set fileencoding=utf-8

Forzamos que la codificación del documento sea utf-8

" Background will always be black
set background=dark

Me encanta la consola negra y así seguirá siendo :)

" Show ruler
set ruler

" Show current combination of keystrokes
set showcmd

Información sobre la posición, columna y posición del cursor en la página. Además, mostrar la combinación de teclas que estemos realizando.

" I like wrapping lines in vim
set wrap

Activamos que el texto no continúe más allá del borde derecho de la ventana (o split) en el que esté.

" 1 tab = 4 spaces
set tabstop=4

" Same for autoindenting
set shiftwidth=4

" Use tabs, not spaces for indenting
set noexpandtab

" Indenting
set autoindent
set smartindent
set copyindent

" Insert tabs on the start of a line according to shiftwidth, not tabstop
set smarttab

" Use multiple of shiftwidth when indenting with '<' and '>'
set shiftround

Uso de tabs en vez de espacios y definir que el espacio de un tab equivale a 4 espacios. Además, que la indentación sea “inteligente” y cuando por ejemplo usamos {, se indente automáticamente y al hacer escribir }, haga lo contrario.

" Show matching parenthesis
set showmatch

Ayuda a ver los bloques en códigos complicados. Además, pulsando % cuando estamos sobre uno de ellos, automáticamente salta al otro ;)

" Do not show line numbers (hate them)
set nonumber

No mostrar los números a la izquierda, en el lateral. Estoy muy acostumbrado a mirar al ruler y usar :n para ir a una línea. Además, es más cómo cuando copias seleccionando con el ratón y pegas en otro sitio.

" I like case-sensitive searching, but this is the best of both worlds:
" search is case-insensitive but it is not when using at least one capital
set ignorecase
set smartcase

Me gusta buscar y que distinga mayúsculas y minúsculas, pero activando estas dos opciones, por defecto busca sin distinguir, pero si cualquiera de las letras es mayúscula, entonces sí que hace distinción.

" Do not highlight searchs
set nohlsearch

Cuando buscas algo, no marcar los resultados. Me marea mucho que cuando busco algo, empiece a marcar toda la pantalla. En caso de necesitarlo, lo activo momentáneamente, pero me gusta desactivado.

" Commands to be rememebered
set history=500

Vim y su potencia de historial de comandos. Prefiero una lista más larga que los 20 por defecto, que no ocupa nada en disco.

" Undo levels
set undolevels=1000

Deshacer en un fichero “casi” infinito ;)

" Change terminal title
set title

Cambia el título del terminal para que muestre el path y fichero que se está editando. Comodidad.

" Like beeping
set novisualbell
set noerrorbells

Ni avisos visuales ni sonoros ante errores.

" Swap file save my work many times :)
set swapfile

Crear el fichero de intercambio .[nombrefichero.ext].swp porque no es la primera vez que consigo recuperar mi trabajo gracias a él. A veces son molestos estos ficheros, pero podemos definir un directorio donde se crean todos, en vez de justo en el mismo sitio que el fichero.

" Disable folding
set nofoldenable

Prefiero ver el texto completo, sin recoger.

" Custom filetype configuration
filetype plugin indent on
autocmd filetype yaml set shiftwidth=2 tabstop=2 expandtab

Activamos indentaciones distintas según tipo de fichero y defino que los YAML tengan espacios en vez de tabs y con un tamaño de dos (así lo requiere el formato YAML)

" No syntax highlighting
syntax off

No me gusta el syntax highlighting. Y cuando te acostumbras a ello, luego todo te da igual y ves antes los errores (menos cuando te dejas un comentario sin cerrar, jeje)

" Use F2 when pasting to avoid applying indents
set pastetoggle=<F2>

Opción muy interesante cuando usamos indentación automática. Si pegamos texto (por ejemplo código), vim piensa que sabemos escribir muy muy rápido y si hemos definido, como efectivamente he hecho antes, que haga indentación automática, si el texto que estamos copiando también lo lleva, el efecto que provoca es bastante desagradable. Con esta opción, definimos que, pulsando la tecla de función F2 en modo INSERT, activamos el modo paste (pegar) de modo que deshabilita momentáneamente estos indentados. De esta forma, conseguimos que el texto se pegue como realmente queremos.

" When line wrapping is enabled this make that when pressing up or down goes
" the visual line up or down, not physical line
" I only enable it sometimes
"nnoremap j gj
"nnoremap k gk

Estas líneas no las tengo activadas, pero las guardo para acordarme. Vim considera que cuando le das hacia arriba, bien sea pulsando la k en modo comando o bien la tecla arriba si así lo tenemos mapeado, irá de línea en línea. Al estar activado “wrap lines”, líneas muy largas ocuparán visualmente varias líneas, pero no físicamente. Vim por defecto irá de línea física en línea física. Activando (descomentando) estas lineas, provocaremos un comportamiento más “natural” ya que al movernos entre líneas lo haremos entre las líneas visuales. No lo activo por costumbre ya que me parece más cómodo. Viene muy bien cuando editamos ficheros con pocos saltos de línea (dumps de SQL, csv, etc)

" Easy change between splits
map <C-h> <C-w>h
map <C-j> <C-w>j
map <C-k> <C-w>k
map <C-l> <C-w>l

Mapeos de teclas que uso mucho. Usando splits, para moverme entre ellos uso Control+[h|j|k|l] en vez de Control+w + [h|j|k|l]

" When you forget to sudo
" http://forrst.com/posts/Use_w_to_sudo_write_a_file_with_Vim-uAN
cmap w!! w !sudo tee % >/dev/null

Si alguna vez olvidas hacer sudo editando un fichero, para que no tengas que salir y volver a hacerlo ;)

" Mappings for FindFile & config
nmap , :FindFileSplit
nmap ; :FindFileCache .
let g:FindFileIgnore = ['*.o', '*.pyc', '*/tmp/*', 'cache_*', '*.swp']

Mapeos y configuración de FindFile. La coma para buscar fichero, punto y coma para que indexe y añado que no indexe fichero que empiecen por cache_ ni terminen en .swp

Plugins

Algunos plugins de vim que considero bastante útiles. Iré añadiendo más en posteriores posts.

Pathogen

Creo que queda poco por añadir. Plugin que te permite organizar el resto de tus plugins de modo que cada plugin ocupa una carpeta distinta dentro de ~/.vim/bundle/ en vez de juntarlos todos en sus correspondientes carpetas en la carpeta raíz ~/.vim/

De esta forma, añadir o quitar plugins consta simplemente de añadir o quitar toda una carpeta.

FindFile

Este plugin permite recopilar todos los ficheros y poder abrir ficheros usando autocompletado. A partir del directorio donde nos encontramos, le decimos a FindFile (usando :FC) que rastree todos los ficheros y que guarde una relación de todos ellos con el lugar exacto donde se encuentran. Entonces, usando :FS o :FF (dependiendo si queremos que el fichero lo abra en un nuevo split horizontal o no) podremos ir escribiendo el nombre del fichero y automáticamente nos dará todas las posibilidades.

Lo primero que tenemos que tener en cuenta es estar en el directorio adecuado. Para ello, nos ayudaremos de unos comandos cuya funcionalidad es igual a la de la consola:

  • :pwd nos dice el directorio en el que nos encontramos
  • :cd para cambiar de directorio. Tenemos que indicar el directorio al que queremos ir. El autocompletado mediante tab ayudará mucho

Yo tengo mapeada la tecla ; (punto y coma) a :FC y , (coma) a :FS para trabajar con más rapidez.

Este plugin tiene un par de limitaciones que me parecen bastante importantes y hay que tener en cuenta.

La primera es que el autocompletado funciona letra a letra desde el principio del nombre del fichero. No valen comodines. No es muy crítica, pero algunas veces viene muy bien poder hacerlo.

La segunda es que no guarda el resultado de :FC en ningún sitio y hay que ejecutarlo cada vez que usamos vim. Esto es un engorro si hay muchos ficheros ya que estaremos varios segundos hasta que podamos empezar a trabajar.

NERDTree

Si te gusta el sistema de ficheros, tanto directorios como ficheros con forma de árbol, este es tu plugin. Tecleando :NERDTree abrirá un split vertical a la izquierda a todo lo alto mostrando los directorios y ficheros al estilo :Sex, pero con la diferencia de poder abrir y cerrar los directorios en vez de entrar a navegar por ellos. Usando la tecla o sobre cualquier fichero, lo abrirá en la ventana que teníamos activa antes de abrir NERDTree y si usamos la i, lo hará en un split horizontal distinto, de modo que la antigua ventana siga disponible.

En cualquier momento podemos cerrar este árbol y volverlo a abrir. Además, puede sustituir a :Sex sin ningún problema y es realmente cómodo.

snipmate

Para poder insertar snippets en vim. Tan sencillo como escribir una palabra clave y al pulsar tab, insertará el snippet. Flexible y potente. Además, se definen zonas de modo que, tras insertar el snippet, usando el tab podemos ir de uno a otro y así completar toda la información. Cada zona tiene un texto por defecto.

El vídeo demo os aclarará completamente su funcionamiento.

Gracias a que el plugin se encuentra en github, en vez de usar directamente este plugin, lo que he hecho ha sido hacer un fork del proyecto en mi cuenta y usar este como plugin. Esto me permite cambiar y añadir snippets manteniendo siempre el repositorio original como referencia. Realizando un simple merge, puedo actualizar todos los cambios del plugin original. Esto evidentemente añade un paso más a todo el proceso explicado en el post anterior ya que primero tengo que actualizar mi fork con el repo oficial y segundo, actualizar el submodule, pero a cambio obtengo independencia total y compatible a cambios con el repo original.

sparkup

Este plugin me ha parecido muy curioso y potente, pese a que no escribo mucho HTML. Para explicarlo, es más fácil ver el vídeo demo, pero rápidamente diré que permite definir con una sintaxis muy sencilla el código HTML a generar y él se encargará automáticamente.

Por ejemplo, escribiendo:

ul.menu > li*2 > a > span < < <

y pulsando Control+e, generará:

<ul class="menu">
  <li>
    <a href="#">
      <span></span>
    </a>
  </li>
  <li>
    <a href="#">
      <span></span>
    </a>
  </li>
</ul>

Y muchas más opciones. Además, podremos ir editando cada una de las zonas de forma sencilla usando tab.

<li><a href=”#”><span></span></a></li>


nov 3 2010

Mis configuraciones de vim (I)

tatai

Hace ya algún tiempo que quiero recopilar todas las configuraciones de vim que tengo repartidas en un montón de cuentas con la intención de centralizarlas de alguna forma y hacerlo todo mantenible que pudiese y ha llegado el momento. Era una de esas cosas que procastinaba constantemente pese al uso bastante intensivo que hago de vim. Y lo peor es que no había pensado completamente en la forma de hacerlo. Tenía claro que quería usar versionado y git tenía muchas papeletas en vista de todo lo que he visto, aprendido y gozado con este DSCM, pero poco más.

La solución ha llegado tras ver este post en vimcasts.com (recomiendo encarecidamente ver el screencast) que me ha parecido tan sencillo y tan potente. En este primer post voy a explicar este método y en el siguiente contaré cuál es mi configuración actual (aunque irá evolucionando, pero bueno, que sirva de ayuda).

La idea es muy sencilla: crear un repositorio de git (que centralizaremos en github.com) que clonaremos en nuestro directorio ~/.vim y, gracias a un par de trucos, extenderlo a todas las cuentas que tengamos de forma sencilla. Nadie nos quita tener que actualizar cada una de nuestras cuentas, pero bueno, podemos tirar de un cron que lo haga automáticamente :)

Usando pathogen

Este plugin para vim es un must-have si usas muchos plugins o, aunque uses únicamente uno, para poder tener todo bien organizado. Cada plugin de vim, en función de sus necesidades, puede estar repartido en múltiples carpetas dentro del raíz de nuestro ~/.vim. Es decir, un plugin nos puede obligar a esta estructura de directorios:

  • ~/.vim
    • doc/
      • plugin.txt
    • plugin/
      • plugin.vim
    • syntax/
      • plugin-syntax.vim

Si multiplicamos esto por varios plugins, teniendo en cuenta que hay más directorios posibles, añadir o quitar plugins es un engorro. Gracias a pathogen, en vez de tener repartidos los ficheros de cada plugin, podremos tenerlos todos juntos, los del mismo plugin en una carpeta, algo que es tremendamente cómodo ya que añadir o quitar un plugin es cuestión de añadir o quitar una carpeta. Muy sencillo.

Con el ejemplo anterior, nos quedaría:

  • ~/.vim
    • bundle/
      • nombre-plugin/
        • doc/
          • plugin.txt
        • plugin/
          • plugin.vim
        • syntax/
          • plugin-syntax.vim

Lo único que tenemos que hacer es descargarnos pathogen.vim y colocarlo en la carpeta ~/.vim/autoload/ (comprobar lo que dice el autor, es posible que esto cambie en el futuro) y añadir estas dos líneas en nuestro ~/.vimrc:

call pathogen#runtime_append_all_bundles()
call pathogen#helptags()

Enlazar ~/.vimrc

Como he explicado al principio, la principal idea es versionar el directorio ~/.vim/. Entonces, ¿qué pasa con ~/.vimrc? Efectivamente, este fichero (y ~/.gvimrc si usas gvim) se quedarían fuera y no los podríamos versionar, teniendo el gran inconveniente de que no podríamos guardar toda nuestra configuración.

Para solucionar este problema, lo que se propone en vimcasts.com es renombrar este fichero a ~/.vim/vimrc (atentos que no se llamaría .vimrc sino vimrc y, por lo tanto, sería visible) y crear un enlace simbólico. Es decir:

mv ~/.vimrc ~/.vim/vimrc
ln -s ~/.vim/vimrc ~/.vimrc

Esto nos permite versionar también este fichero con el punto extra añadido que volvemos al fichero visible y más cómodo de localizar.

Submodules en git

Por último, y no menos importante, trabajar con submodules de git en un repositorio. Partiendo de un repositorio de git ya creado, con los submodules podemos indicar a ese repositorio que los datos de un directorio se extraen de un repositorio git externo a ese. En subversion, sería el hermano mayor de svn:external.

Muchos de los plugins de vim se han ido migrando a git y no sólo eso, sino que también los repositorios mantienen la estructura necesaria del plugin dentro de la carpeta ~/.vim y, por lo tanto como he explicado, gracias a pathogen podremos agrupar ese plugin en una carpeta muy fácilmente.

Vamos a dividir en dos partes. La primera en la que le decimos a nuestro repositorio cuál es el plugin externo (vía submodule) y hacemos el commit & push y la segunda en la que clonamos nuestro repositorio en otra máquina e inicializamos y actualizamos los submodules.

Definiendo el repositorio externo

Supongamos que queremos instalar NerdTree que se encuentra git://github.com/scrooloose/nerdtree.git y ponerlo en bundle/nerdtree

git submodule add git://github.com/scrooloose/nerdtree.git bundle/nerdtree
git add .
git commit -m "Install NerdTree.vim as submodule."
git push origin master 

Notar que tendremos que estar en el directorio donde se encuentra el directorio .git/ y que la configuración del submodule se guarda en .gitmodules (al mismo nivel que .git/)

Clonando y actualizando

Suponiendo que nuestro repositorio se encuentra en git://github.com/tatai/vim.git, lo que haremos primero será clonar el repositorio en nuestra carpeta ~/.vim y posteriormente inicializar y actualizar los submodules:

cd ~
git clone git://github.com/tatai/vim.git ~/.vim
cd ~/.vim
git submodule init
git submodule update

Si todo ha ido bien, si entramos en vim tendremos disponible toda nuestra configuración y plugins que hallamos subido.

A partir de este momento, si queremos actualizar uno de los submodules, tendremos que ir a su directorio y usar git pull. Por ejemplo, usando el ejemplo anterior de nerdtree:

cd ~/.vim/bundle/nerdtree
git pull

Ventaja de usar git

Una de las ventajas añadidas que tiene usar git es que, en cualquier momento, puedes crear tu propia versión de un plugin sin perder de vista el código original ni que nuestras configuraciones pierdan sincronización.

Voy a poner un ejemplo concreto con snipmate del que hablaré en el siguiente post más tranquilamente. Resumiendo, este plugin permite que, en función de ciertas palabras clave, definir snippets. Es una gran utilidad y todas las plantillas se encuentran en la misma carpeta del plugin.

¿Qué ocurriría si queremos añadir más snippets o cambiar el formato de alguno de ellos, por ejemplo porque no se adapta a nuestro estilo de programar? Evidentemente, si usamos el código original del autor sólo podremos enviarle un patch-request que aceptará si quieres o no.

Lo que podemos hacer en estos casos es hacer un fork, como por ejemplo he hecho yo en http://github.com/tatai/snipmate.vim. Un fork nos permite tener una versión propia del repositorio de otro usuario, considerándola como una fuente más de nuestro código, lo que nos permite no sólo reportar errores o mejoras al autor, sino también añadir lo que nosotros creamos más conveniente.

Así pues, a la hora de añadir el submodule, en vez de usar el repositorio original del autor:

git submodule add git://github.com/msanders/snipmate.vim bundle/snipmate

Usaremos como origen el nuestro propio:

git submodule add git://github.com/tatai/snipmate.vim bundle/snipmate

Esto claramente nos añade un paso más, ya que no bastará con actualizar los nuestros directorios ~/.vim sino también mantener este otro repositorio.


dic 28 2009

Resaltado de sintaxis e indentación en vim

tatai

He decidido que voy a realizar una serie de posts con aquello que tanto me han pedido unos cuantos amigos, que “enseñe algunos de esos comandos que me sé”. La verdad es que la mayoría de ellos son comandos sencillos pero que, usando un par de opciones y concatenando unos con otros, se pueden hacer verdaderas maravillas.

Y para empezar, un par de trucos muy sencillos para vim con lo que sé que más de uno levantará los brazos al cielo con resignación, jeje. Se da por hecho que sabes cambiar entre los distintos modos: comando, edición, visual…

Resaltado de sintaxis

Con este comando podrás activar (como será el caso de la mayoría de vosotros) o desactivar (lo que yo prefiero, jeje), el resaltado de sintaxis -syntax highlighting- de los ficheros que estéis editando en vim.

Partiendo siempre en modo comando, podemos activar o desactivar:

Para activar el resaltado de sintaxis

:set syntax on

Y para desactivar

:set syntax off

Tienes que tener en cuenta que para reconocer a que lenguaje pertenece, vim se basa en la extensión. Si todavía no has grabado el fichero o tiene una extensión distinta a la que debería tener, no será capaz de identificar nada.

Indentación

Para la indentación, todo depende de gustos pero yo prefiero usar tabs y que el tamaño del tab (el número de espacios no físicos que ocupa) es de 8 columnas. Esta es la configuración por defecto.

Para activar la indentación, en modo comando hay que teclear:

:set autoindent
:set smartindent

En caso de querer desactivar cualquiera de las dos, tenéis que añadir el prefijo no- a la opción usando la misma sintaxis, es decir, usar “noautoindent” o “nosmartindent” respectivamente.

Más info

Del manual de vim


jun 21 2009

Migrar fácilmente el selector dolar a document.id (mootools 1.2.3)

tatai

Voy a contar un par de sencillos comandos que os ayudarán si queréis migrar todos vuestros selectores dolar ($) a la nueva forma definida en mootools 1.2.3: document.id.

La primera forma es ejecutar un comando desde la línea de comandos. Todo lo que necesitas es tener instalado perl en tu sistema. Este es el comando (cambia fichero.js por el nombre de tu fichero javascript):

perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' fichero.js

Quizás prefieras usar -i.old en vez de -i que hará una copia de tu fichero original fichero.js a fichero.js.old. De esta forma, mantienes una copia de tu fichero original.

Por supuesto este comando se puede usar con otros como find de modo que puedas migrar más de un fichero a la vez:

for i in $( find /path/a/tu/directorio/js -iname '*.js' ); do perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' $i; done

Finalmente, para todos aquellos que como yo usen y prefieran vim, voy a mostrar como se hace el cambio con vim. Asegúrate que estas en el modo-comando (presiona varias veces la tecla <Esc>) y escribe:

:%s/\([^\$]\)\$(/\=submatch(1) . "document.id("/g

Y eso es todo! Disfruta de tu nuevo código que cumple con la especificación de compatibilidad entre frameworks javascript.


jun 21 2009

Easy migrating dolar selector to document.id (mootools 1.2.3)

tatai

I would like to show you a pair of easy command that will help you if you want to change all your dolar selectors ($) to the new defined document.id in mootools 1.2.3.

The first way can be executed from command line. All you need is having perl on your system. This is the command (change your_file.js to the filename that fits your needs):

perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' your_file.js

Perhaps you will prefer to use -i.old instead -i that will copy your original file your_file.js to your_file.js.old. In this way, you get a backup of your original file.

Of course, this command can be used with others like find so you can migrate more files at once:

for i in $( find /path/to/your/js/files -iname '*.js' ); do perl -i -pe 's/([^\$])\$\(/$1document.id(/g;' $i; done

Finally, for those vim lovers like me, I would like to show you how to make this change inside vim. In command-mode (press <Esc> a pair of times) write:

:%s/\([^\$]\)\$(/\=submatch(1) . "document.id("/g

And that’s all! Enjoy your new brand cross-framework compliant code.


may 28 2009

Abrir varios ficheros a la vez con vim

tatai

Cuando queremos abrir varios ficheros a la vez desde la consola, la forma más habitual es la de escribir el comando vim y después añadir cada uno de los ficheros separados por al menos un espacio. De esta forma, mediante los comandos :next y :previous (recordar pulsar <Esc> antes de introducir comandos) podemos pasar de un fichero a otro.

Esto está bien cuando no te importa tenerlas en ventanas distintas, ¿pero y si queremos tenerlos todos a la vista a la vez? Bien, una de las formas es decirle a vim que no abra cada una en una ventana distinta, sino mediante horizontal splits, es decir, que si tenemos dos ficheros abiertos, cada uno ocupa la mitad de la pantalla (en horizontal).

Para conseguir esto, lo único que tenemos que hacer es escribir en la consola vim -o y luego todos y cada uno de los ficheros separados al menos por un espacio. Es decir, lo haremos con la opción -o (letra o minúscula). Tal que así:
vim -o fichero1.txt fichero2.txt fichero3.txt
Bien, todo tiene un límite. Vim abrirá tantos ficheros como le indiqueis… pero es evidente que si abrís muchos a la vez, no tendremos espacio para verlos.
Ideal para usar con algunos scripts :)

vim con la opción -o

vim con la opción -o


jul 22 2007

vimdiff, un diff de ficheros con vim para consola

tatai

Leo en DiarioLinux sobre la interesante aplicación vimdiff. Es un diff de ficheros de modo que podemos extraer las diferencias que tienen varios ficheros entre sí, pero la gran diferencia es que lo veremos sobre un vim con un split vertical y con scroll en paralelo!

Es decir, en cada split nos muestra uno de los ficheros, indicando con colores los cambios y si nos desplazamos por el fichero hacia abajo, los splits se moverán simultáneamente para mostrarnos las mismas líneas en ambos ficheros. Lo más habitual es comparar un fichero con otro, pero permite comparar hasta con 3 versiones distintas más.

Tan fácil como teclear en la consola vimdiff y seguidamente los ficheros que queremos comparar separados con espacios. Es decir, la sintaxis es:
vimdiff file1 file2 [file3 [file4]]
 También de forma equivalente, podemos llamarlo directamente desde vim con la opción -d:
 vim -d file1 file2 [file3 [file4]]
La verdad es que existen varias aplicaciones para hacer esto de forma visual con las X, pero es la primera que he visto con la que se puede hacer por consola y por lo tanto, con independencia de donde estés, sólo hace falta una consola y un SSH. Reconozco que soy un fanático del vim, pero la verdad es que me ha parecido muy útil.

Lo mejor es probarlo :D

vimdiff en acción