martes, febrero 26, 2013

vim: Edición de varios ficheros simultáneos. Buffers, ventanas y pestañas.





Cuando una persona comienza a trabajar por primera vez con vim, puede pensar que es un editor que no es capaz de manejar varios ficheros a la vez, siendo necesario ejecutar varias copias del mismo simultáneamente, cada una de las cuales se usaría para editar un fichero distinto. Esto no es cierto, porque vim  tiene un potente mecanismo de buffers, ventanas y pestañas que permite desde un sólo proceso editar múltiples ficheros.

En vim:

  • Un buffer no es más que un fichero cargado en memoria para la edición. Todas las modificaciones que se realicen se hacen sobre este buffer. El fichero original que se está editando no se modifica hasta que no se da una orden de escritura. Existen ciertos buffer que no hacen referencia a ningún fichero
  • Una ventana no es más que una vista de un buffer de terminado. Puede haber más de una ventana que muestre contenidos del mismo buffer. Para que vim pueda usar varias ventanas debe de haberse compilado con soporte para las mismas.
  • Una pestaña no es más que un conjunto de ventanas.

Buffers

Cuando se comienza a editar un fichero con vim desde la línea de comandos, vim creará un buffer para cargar el contenido del fichero y creará una ventana donde mostrar el contenido de ese buffer. Cualquier orden que implique la edición de un fichero como :new o :edit creará automáticamente un buffer asociado al mismo, y lo añadirá a la lista de buffers que tiene vim.

Un buffer en vim puede estar en cualquiera de estos tres estados:

  • Activo (active), en dicho caso el contenido del buffer está mostrado en una ventana.
  • oculto (hidden), el buffer no se muestra en ninguna ventana.
  • Inactivo (inactive), el buffer no se muestra en ninguna ventana y no tiene contenido2.

Un buffer cuyo contenido se muestra en una  ventana puede ocultarse con la orden :hide - siempre que no sea el último buffer en la lista, en cuyo caso dará un error -. También este comando puede usarse para iniciar la edición de un fichero ocultando el buffer actual sin necesidad que tengamos que salvar los cambios. Si estamos editando un fichero f1.txt, modificamos su contenido e introducimos la orden :e f2.txt para editar el fichero f2.txt, si no se ha grabado previamente el contenido de f1.txt vim dará un error advirtiéndonos que el fichero ha sido modificado y no se ha grabado. Sin embargo, si es edita con :hide e f2.txt, el buffer que coniene el fichero f1.txt dejará de mostrarse en la actual ventana, pasará a estar oculto y la ventana tendrá asociado ahora el buffer con el fichero f2.txt. Este comportamiento puede verse en las siguientes capturas de pantalla



Se puede añadir buffers con la orden :badd file, la cual añadirá a la lista el fichero file, pero sin cargarlo en memoria. Esto último sólo sucederá cuando seleccionemos dichos buffer para mostrar su contenido en una ventana.

Para ver los buffers que actualmente tiene vim cargados se puede usar cualquiera de las siguientes tres órdenes: :ls,:buffers o :files. Para movernos por dicha lista se pueden usar las órdenes :bnext y :bprev. Para poder cambiar de un buffer a otro, si éste tiene cambios se deben de escribir, o bien usar las órdenes :bnext! o :bprev! las cuales descartarán los cambios realizados antes de mostrar el buffer siguiente o anterior en la lista. También existen comandos para irnos al primero, :bfirst o al último :blast. Estos comandos también admiten la forma :bfirst! o :blast! para descartar los cambios actuales antes de irse al primer o último buffer de la lista.

Para los que estén acostumbrados a interfaces MDI puede ser interesante en modo normal mapear la secuencia de teclas CTRL-TAB y CTRL-SHIFT-TAB para que vaya rotando por la lista de buffers, cosa que puede hacerse con los siguientes mapeos de teclas:


:map <C-Tab> :bnext<cr>
:map <C-S-Tab> :bprev<cr>

Ventanas

Las ventanas no son más que vistas de un buffer determinado. Cuando se comienza a editar un fichero nuevo con vim, se crea el buffer asociado al mismo, y se crea una ventana que nos muestra el contenido de dicho buffer. A partir de aquí podemos crear varias ventanas, que utilicen el mismo buffer o distintos, y que la división de la misma sea vertical u horizontal.  Si se usa las combinaciones de teclas por defecto que trae vim, a partir de una ventana, podemos dividir la en dos horizontalmente si usamos la combinación de teclas por defecto, en modo normal, CTRL-W s dividirá la ventana actual en  dos, cada una de las ventanas haciendo referencia al mismo buffer,  Pero también podemos dividir la ventana verticalmente si usamos la combinación de teclas CTRL-W v, como puede verse en las dos capturas de pantalla siguientes. También puede crearse una ventana que haga referencia a un buffer vacío para empezar a editar un fichero nuevo CTRL-W n, que en este caso siempre divide la ventana actual horizontalmente.


División horizontal

División vertical

Las dos capturas anteriores sirven de ejemplo de como tres ventanas diferentes hace referencia al contenido del mismo buffer.

Para movernos entres las diferentes ventanas se usa CTRL-W + cursores , o si se prefiero CTRL-W j (abajo), CTRL-W k (arriba), CTRL-W h (izquierda) o CTRl-W j derecha, que realmente son las teclas de movimiento del cursor de vim en modo normal precedidas de la pulsación del CTRL-W. Para cerrar una ventana, se usa CTRL-W c, eso si, suponiendo que no esté modificada, y que en este caso no sea la última ventana que utilice dicho buffer

Todas las combinaciones anteriores de teclas tiene las correspondientes órdenes que puede ejecutarse desde el modo comando, que además admiten parámetros opcionales, que permiten pasar, por ejemplo, el tamaño de la ventana a hacer la división o lo que es más importante, el nombre del fichero nuevo que se desea editar. Así por ejemplo para dividir la ventana actual y cargar el fichero hola.txt en la misma sea usa :split hola.txt - si se quiere  la división vertical :vsplit hola.txt, mientras que si se quiere crear una ventana en la que exista un buffer vacío para poder empezar a editar se puede usar :new o :vnew.

Todo esto es una breve introducción a como usar las ventanas, ya que si se consulta el fichero de ayuda de windows.txt, puede verse que existen multitud de opciones y comandos que sirven para tener un control exacto sobre lo que se quiere hacer. 

Pestañas

Par el uso de pestañas en vim, podéis consultar Vim: Uso de pestañas (tabs), una entrada de este mismo blog que escrita hace algún tiempo.

Referencias

  1. Puede verse la ayuda de vim desde el modo comando con :help windows.txt
  2. Editing more than one file
  3. Splitting windows
  4. Vim buffer FAQ
  5. How do you prefer to switch between buffers in Vim?

Notas

  1. Puede ser abreviada como e
  2. Se utiliza para recordar opciones de buffers que han sido cargados previamente.

Technorati Tags: ,




No hay comentarios: