jueves, 26 de febrero de 2009

HAL y vim (II)

El día pasado nos quedamos a punto de revelar el secreto de Vim, su idea genial. Como, a pesar de ser particularmente original, esta idea es bien simple, podemos resumirla en pocas palabras.

Editar un texto implica dos actividades diferentes: la de escribirlo (mecanografiarlo) y la de modificar lo escrito o, en general, cualquier otra actividad no relacionada directamente con la escritura, como las de cerrar o abrir el editor mismo. La interfaz de un editor tiene que contemplar esta diferencia y para cada una de estas actividades proporciona medios diferentes. Hoy estamos acostumbrados a que la acción de modificar y, en general, cualquier otra acción que no sea escribir, se realice mediante el ratón, pero también existe la posibilidad de utilizar, en su lugar, combinaciones especiales de teclas, los llamados "atajos" en los editores gráficos. Por ejemplo, la combinación 'Ctrl+C' es frecuente cuando se trata de copiar un fragmento de texto previamente seleccionado; por su parte, la combinación 'Ctrl+Q' sirve para cerrar la aplicación. El editor de consola Emacs utiliza esta misma técnica, si bien con un grado de elaboración mucho mayor que en un editor gráfico. El problema de esta aproximación es que, aun proporcionando, en general, mayor rapidez que el simple uso del ratón, obliga a las manos a abandonar el conjunto de teclas habituales para la escritura, que es, además, el más próximo a ellas, con la pérdida consiguiente de velocidad y la sobrecarga física añadida.

¿Por qué no utilizar las mismas teclas con las que habitualmente escribimos para realizar el resto de operaciones? Si dispusiésemos de varios teclados sería factible, simplemente asignando a cada teclado una función específica y cambiando de uno a otro cuando fuera necesario. Naturalmente, esto lentificaría el proceso de la edición tanto o más que el uso del ratón. Pero ¿y si no necesitásemos teclados físicamente diferentes, sino múltiples teclados virtuales funcionando sobre un mismo teclado físico? Los problemas anteriormente descritos se resolverían de un plumazo y la rapidez y naturalidad de la edición mediante este procedimiento no tendrían parangón. Esta idea, tan extraña como sencilla, es la idea original de Vim.

Consideremos nuestro teclado físico como el soporte de varios teclados virtuales (modos los denomina la literatura técnica sobre Vim). Estos modos o teclados son básicamente dos: el teclado con el que introducir o insertar texto y el teclado para realizar el resto de operaciones de modificación del texto o de manipulación de la aplicación, llamémoslo teclado de órdenes, porque es el que permite solicitar al editor que ejecute distintas funciones sobre lo escrito o sobre su propio estado. Consideremos también que el teclado virtual que se presenta de entrada es el teclado de órdenes. Naturalmente, necesitaremos de un mecanismo para cambiar este teclado por el teclado dedicado a la inserción del texto. Este mecanismo es ---cómo no--- una tecla, la tecla 'i', de insertar. También necesitamos de un procedimiento análogo para regresar al teclado inicial, el de las órdenes, es decir, para escapar del teclado de inserción y volver a la situación inicial. En este último caso, la tecla pertinente es la tecla 'Esc'. Por tanto, las teclas 'i' y 'Esc' tienen un significado especial dependiendo del teclado virtual o modo activo en el momento en que se pulsan. Son, respectivamente, el dispositivo de conmutación del teclado de órdenes al teclado de inserción (tecla 'i'), y viceversa (tecla 'Esc').

Con este bagaje previo podemos continuar nuestra exploración de los procedimientos que suministra Vim para realizar las funciones típicas del menú "Archivo" especificadas en el artículo precedente. Entonces vimos cómo abrir un fichero. Ahora toca ver, en primer lugar, cómo guardar en el disco duro el contenido editado.

Volvemos a abrir nuestro editor con un fichero de prueba:

vim primera_prueba

Ahora, antes de escribir nada en él, tenemos que conmutar el modo de órdenes, el teclado virtual que está activo en el momento en que se inicia Vim, por el modo o teclado para insertar texto. Para ello pulsamos la tecla 'i' o, lo que es lo mismo, solicitamos a Vim que queremos insertar texto. En la parte inferior de la interfaz de Vim aparecerá seguramente una indicación de que nuestro modo activo después de que Vim ha cumplido nuestra orden es el de inserción:

-- INSERTAR --

Nótese cómo Vim funciona en este sentido de la misma manera que el propio HAL. Vim atiende nuestras solicitudes, que le enviamos desde el teclado, cumpliéndolas como si se tratase de órdenes. Al pulsar 'i' en el modo o teclado de órdenes, estamos haciendo algo muy parecido a lo que hacemos cuando introducimos una orden en la línea de órdenes de HAL, estamos diciéndole a Vim:

Vim, inicia el modo de inserción

Es más, aunque en el caso de estas órdenes absolutamente abreviadas, como la orden 'i', no vemos, por defecto la orden que tecleamos, sino sólo su resultado, existe siempre la posibilidad de introducir órdenes extendidas alternativas, que sí veremos (lo que los entendidos denominan órdenes ex, en honor del editor ex, que habita en el subsuelo de Vim). En muchos casos estas órdenes más largas ---al menos constan de dos caracteres--- son las únicas disponibles y las usaremos profusamente.

Conviene detenerse en este punto crucial, el de las órdenes ex, porque, entre otras cosas, es como mejor se entiende la semejanza entre HAL y Vim.

Una orden ex se inicia con el carácter ':' (dos puntos), tecleado en el modo o teclado de órdenes. Si el lector no ha tocado Vim desde que lo dejamos ahí dispuesto para introducir nuestro texto, debe pasar ahora mismo al modo de órdenes, mediante la tecla 'Esc'.

Activado el teclado de órdenes, tecleamos ':' (dos puntos). El carácter se reproducirá en la parte inferior de la interfaz de Vim. Esta parte inferior, llamada línea de estado, a la que acabamos de acceder al teclear los dos puntos, es semejante a la línea de órdenes de HAL. En este caso es Vim quien está esperando a que le introduzcamos una orden. Nuestra orden va a ser la de antes:

Vim, inicia el modo inserción

que, mediante una orden ex, se expresa de la siguiente manera:

startinsert

Esta orden aparecerá a nuestra vista inmediatamente después de los dos puntos. Al pulsar 'Enter', Vim ejecutará la orden y pasaremos al modo inserción, lo que nos notificará mostrando el texto -- INSERTAR -- en la línea de estado, citada antes. Las órdenes ex también admiten abreviaturas. Así, en lugar de startinsert podemos usar la forma abreviada:

starti

O, incluso:

star

Hemos regresado al modo de inserción, esta vez por vía de una orden ex. (Naturalmente siempre usaremos para cambiar de modo la orden corta 'i'. Aquí una orden ex carece de sentido práctico, como en cualquier otra situación en que existe una forma directa de introducir la orden). Podemos, pues, empezar a escribir nuestro texto. Escribamos, por ejemplo, lo siguiente:

Yo soy yo y tú eres Vim

Nuestro último paso es guardar el fichero recién editado.

En primer lugar conmutamos al modo de órdenes con 'Esc' y desde ahí tecleamos la orden que Vim reconocerá para escribir o guardar la modificación en el disco duro, de nuevo una orden ex, abreviatura de la más larga :write (escribir):

:w

Tras pulsar Enter, Vim nos muestra en la línea de estado el resultado de la ejecución de la orden:

"primera_prueba" [Nuevo] 1L, 25C escritos

Que quiere decir que se ha escrito en el disco el nuevo fichero primera_prueba, el cual consta de 1 línea y 25 caracteres.

El editor sigue ahí con el texto actual del fichero primera_prueba. Podemos continuar realizando la siguiente operación, la de "Guardar como". Vamos o modificar ligeramente el fichero primera_prueba. Escribimos, tras cambiar de modo con 'i', lo siguiente:

Adiós, Vim

Pulsamos 'Esc' para volver al modo de órdenes y tecleamos esta nueva orden:

:w segunda_prueba

Vim volverá a mostrar el resultado de su ejecución, que no es otro que el de guardar la modificación reciente en el fichero segunda_prueba. Adviértase que, sin embargo, el fichero primera_prueba no se modifica a menos que guardemos los cambios en él [Nota: ver mi primer comentario a este artículo].

Voilà! Operación terminada.

Nos queda simplemente salir de la aplicación. Como no vamos a ver en estas sesiones sobre Vim ningún ejemplo de edición de varios ficheros simultáneos ---nos limitaremos a operaciones muy básicas---, las opciones de "Cerrar" y "Salir", típicas de los procesadores y editores de escritorio, son equivalentes.

Existen dos modos de salir. Salir tras guardar los cambios:

:q

que es una abreviatura de:

:quit

y salir sin guardar ningún cambio, opción que nos viene de perlas ahora, para dejar intacto el fichero primera_prueba. (Recuérdese que la última modificación quedó guardada en el fichero segunda_prueba):

:q!

Cuando de lo que se trata es de guardar cambios y salir en un solo golpe, es común usar una orden doble simultánea:

:wq

Enhorabuena, lector, acabas de finalizar tu primera sesión de edición con Vim. Parece endiabladamente complicado. No lo es en absoluto. Tu sensación de mareo es únicamente atribuible a la falta de costumbre. Los usuarios de Vim ---el autor entre ellos--- aseguran que, una vez adquirido el nuevo hábito, es difícil encontrar nada que pueda competir con Vim en rapidez de edición y en versatilidad. La única prevención que hay que tomar es pulsar 'Esc' en los casos en que no se tenga seguridad de qué modo está activo y se quiera emitir una orden para Vim. 'Esc' se puede pulsar cuantas veces se quiera: mil pulsaciones equivalen a una. Así es que, sin miedo, pulsa 'Esc' a discreción cuando vayas a introducir órdenes, ésas que con tanta celeridad Vim cumplirá a las mil maravillas.

Antes del merecido resumen puede ser útil exponer de nuevo el proceso de esta edición simple, iniciado el día pasado, en la forma de un diálogo con Vim [Seguimos las mismas convenciones tipográficas indicadas aquí.]

YO:
HAL, pídele a 'vim' que abra el fichero 'primera_prueba':

[Esta orden es la única que se ejecuta desde la línea de órdenes de HAL, el resto de órdenes se dirigirán a 'vim' desde su propia interfaz.]

vim primera_prueba


HAL:

[HAL nos presenta la interfaz de 'vim'.]

YO:
Vim, inicia el modo inserción:

i


VIM:

[Vim cambia al modo inserción y nos lo notifica en su línea de estado:]

-- INSERTAR --


YO:

[El usuario escribe la siguiente línea: 'Yo soy yo y tú eres Vim'.]

Vim, sal del modo inserción y vuelve al modo de órdenes:

Esc


VIM:

[Vim vuelve al modo de órdenes.]

YO:
Vim, guarda la modificación realizada en el disco.

:w


VIM:

[Vim guarda lo editado y notifica el resultado de la acción en su línea de estado.]

"primera_prueba" [Nuevo] 1L, 25C escritos


YO:
Vim, inicia el modo inserción:

i


VIM:

[Vim cambia al modo inserción y nos lo notifica en su línea de estado:]

-- INSERTAR --


YO:

[El usuario añade lo siguiente a la línea actual: 'Adios, Vim'.]

Vim, sal del modo inserción y vuelve al modo de órdenes:

Esc


VIM:

[Vim vuelve al modo de órdenes.]

YO:
Vim, guarda la modificación realizada en el disco con el nombre 'segunda_prueba':

:w segunda_prueba


VIM:

[Vim guarda la modificación y notifica el resultado de la acción.]

"segunda_prueba" [Nuevo] 1L, 37C escritos


YO:
Adios, vim, y no guardes los últimos cambios en el fichero 'primera_prueba':

:q!




Resumen

  • La idea original de Vim es distinguir modos de operación con el mismo teclado: un modo de inserción para escribir texto y un modo de órdenes para modificarlo o realizar cualquier operación distinta a la escritura. Estos modos funcionan como sendos teclados virtuales sobre un mismo teclado físico.

  • La orden 'i' de Vim cambia al modo inserción.

  • La orden 'Esc' de Vim cambia al modo de órdenes. Es la única orden que puede ejecutarse cuando el modo activo es el de inserción.

  • Existen dos formas de órdenes posibles para Vim, las órdenes que se producen pulsando directamente teclas convencionales en el modo de órdenes y las órdenes ex, que se inician tecleando el carácter ':' (dos puntos) seguido de la orden propiamente dicha. Por ejemplo, :w es una orden ex de Vim.

  • La orden :w de Vim, abreviatura de la orden :write, permite escribir o guardar en disco el resultado de la edición. Cuando va seguida de un nombre de fichero guarda dicho resultado en el fichero de ese nombre.

  • La orden :q de Vim, abreviatura de la orden :quit, sale de Vim. Para salir sin guardar cambios la orden es :q!. Para escribir el resultado en disco y salir en un solo paso la orden es :wq.

  • La tecla 'Esc' es la medicina del usuario de Vim para los patologías frecuentes de confusión de modos.

1 comentario:

  1. Supongamos que estamos editando un fichero de nombre 'antiguo_fichero'.

    Si ejecuto la orden:

    :w nuevo_fichero

    el contenido actual de 'antiguo_fichero' se guarda en 'nuevo_fichero'.

    Pero, el editor me sigue mostrando 'antiguo_fichero'. Es decir, los cambios que haga a partir de ahora, se realizan sobre 'antiguo_fichero' y si guardo esos cambios se guardan en 'antiguo_fichero'.

    Si, por el contrario, mi objetivo es que los cambios se efectúen sobre 'nuevo_fichero', tendría que editar este fichero, puesto que es 'antiguo_fichero' el que sigue delante. Para ello, se usa la orden:

    :edit nuevo_fichero

    Ahora bien, el comportamiento de "Guardar como" en los procesadores de texto es diferente. Si guardo 'antiguo_fichero' como 'nuevo_fichero', lo que se me mostrará ahora para editar es 'nuevo_fichero'.

    Así pues, si éste es el comportamiento que se desea, se deberá utilizar la orden ':edit' como acabo de explicar. Vim proporciona, sin embargo, otra orden que emula exactamente el comportamiento del "Guardar como" de los procesadores de texto:

    :saveas nuevo_fichero

    En consecuencia, si lo que se quiere es reproducir exactamente en Vim el comportamiento de la opción "Guardar como" de los procesadores de texto, es mejor usar la orden ':saveas nuevo_fichero' que la orden ':w nuevo_fichero'.

    ResponderEliminar