viernes, 27 de febrero de 2009

HAL y vim (III)

De las opciones del menú "Archivo" hemos comentado todas menos la última, la de imprimir. Que un editor de texto proporcione esta opción no deja de ser curioso. Como dijimos al principio de estos artículos sobre Vim, un editor no debería en sentido estricto preocuparse por el destino final del documento que se edita. En una buena división de tareas, la presentación física del documento y, en consecuencia, su preparación para una salida impresa, debería ser responsabilidad de otras aplicaciones. El editor le ha de servir al escritor únicamente como herramienta para redactar su trabajo y definir, mediante algún sistema estipulado de marcas, su estructura lógica. El propio escritor o aquél en quien delegase tendría, después, que recurrir a otra u otras herramientas de preparación de documentos (diseñadores y tipógrafos electrónicos) que pudiesen interpretar sus marcas y producir una salida impresa de calidad.

Ahora bien, en documentos rápidos, donde el escritor no tiene tiempo o ganas de utilizar marcas que interpretarán los diseñadores o tipógrafos y donde, a pesar de todo, le gustaría ver una rápida copia impresa, el editor puede tener a bien convertirse en intermediario de los especialistas en la preparación de documentos, que obrarán entonces de un modo relativamente tosco según su nivel real de pericia, pero suficiente para estos deseos precipitados y poco exigentes.

Tal es el sentido de una opción para imprimir en un editor como Vim. Se trata de una opción de uso poco frecuente. De hecho, es raro verla comentada en los manuales sobre Vim. Sin embargo, y puesto que nosotros hemos tomado como hilo conductor las opciones de un procesador de texto, nos topamos de bruces con ella, como si se tratase de lo más natural del mundo, cuando, en realidad, resulta ser un artefacto realmente exótico. A pesar de esta rareza y de la filosofía inicial de esta serie de artículos, nos vemos obligados a referirla, con el fin de no dejar un hueco en la exposición. Tenga en cuenta el lector, no obstante, que no es de buen gusto conformarse con el trabajo rudimentario que Vim puede hacer en este caso. Vim esta diseñado para editar, y nada más. El usuario debería aprender en su momento a recurrir por sí mismo a los especialistas en preparación de documentos y conocer el sistema de marcas con el que etiquetar su texto para que aquéllos obren en plenitud de sus facultades.

Hecha la necesaria aclaración, es muy fácil pedir a Vim que se encargue de devolvernos una copia impresa del documento actual:

:hardcopy

Esta orden enviará el documento actual a la impresora establecida por defecto. Naturalmente, se presupone que la infraestructura para que funcione la impresora está a punto, cosa que debería suceder tras una instalación genérica de una distribución GNU/Linux.

Si en lugar de enviar directamente a la impresora el documento actual, se prefiere guardarlo en un fichero, se puede utilizar en su lugar esta otra orden:

:hardcopy >nombre_fichero.ps

Nótese aquí el operador de redirección, que ya conocemos y que tiene exactamente el significado esperado. El nombre de fichero es, obviamente, el que el usuario decida, su extensión .ps es también opcional, aunque conveniente, puesto que define explícitamente el tipo de fichero que se generará, un fichero PostScript.

Pongamos a prueba la orden con un texto existente. Por ejemplo, con un fragmento de la ayuda en línea de Vim. Sí, lector, como es costumbre en el mundo de HAL, Vim proporciona una gigantesca ayuda en línea a la que se puede acceder con la orden:

:help

No es propósito de estos artículos de iniciación tratar de este extraordinario sistema de ayuda y de todas sus sutilezas. Queda al arbitrio del lector investigar ahí por su cuenta.

El fragmento de la ayuda de Vim que seleccionaremos para imprimir puede ser, por qué no, la sección relativa a la impresión, a la que se accede mediante la orden:

:help printing

Ahí tenemos una página visible de la sección entera sobre este tema. Hagamos que Vim llame al especialista en preparación de documentos y nos produzca una copia impresa de la sección completa, que guardaremos en el fichero vim_ayuda_imprimir.ps:

:hardcopy >vim_ayuda_imprimir.ps

Este fichero puede abrirse pidiendo a HAL que utilice un visor de documentos como okular (en entornos Kde) o evince (en entornos Gnome o Xfce):

okular vim_ayuda_imprimir.ps

Pero, en lugar de salir de Vim ---o enviarlo al trasfondo con 'Ctrl+Z'--- para poder ejecutar esta orden, vamos a hacerlo desde dentro del propio Vim. Ello es posible gracias a un tipo especial de orden ex, que se expresa mediante un signo de admiración (!). Es el medio de que disponemos para advertirle a Vim algo parecido a esto:

¡Eh, Vim, quiero enviar a HAL la siguiente orden! ...

Por ejemplo, dentro de la interfaz de Vim puedo pedir a HAL que me diga mi nombre de usuario:

:!whoami

El resultado se mostrará en la parte inferior de la interfaz de Vim. Después de pulsar 'Enter', regresaremos exactamente al mismo punto en el que estábamos antes de la ejecución de la orden.

Este peculiar dispositivo de Vim para interactuar con HAL desde dentro de él tiene asombrosas aplicaciones. Aquí no vamos a tratarlas. Pero el autor no se resiste a proponer al menos una, algo más complicada que la anterior. Imaginemos que estamos editando un texto y queremos introducir en él la hora exacta de edición. Podemos hacerlo directamente desde Vim, utilizando la orden :r (abreviatura de :read), que lee su argumento (un fichero o la salida de una orden de HAL) y lo introduce en el documento actual:

:r ! date | cut -d' ' -f4

Esta orden escribirá, por defecto, la hora actual en la línea siguiente a la que se está editando. Como se ve, es sintácticamente análoga a la orden :wq, vista el día pasado. En el caso actual se ejecutan dos operaciones: la que realiza :!date | cut -d' ' -f4 y la que realiza :r. Los espacios entre las órdenes ex son opcionales; no así, como sabemos, los espacios existentes ente el nombre de la orden (aquí, una orden de HAL) y sus argumentos. En consecuencia, podíamos haberla escrito también de esta otra forma menos legible:

:r!date | cut -d' ' -f4

Volvamos a nuestra humilde y elemental orden para visualizar el fichero vim_ayuda_imprimir.ps y hagamos que HAL la ejecute desde Vim

:okular vim_ayuda_imprimir.ps

He aquí la primera página del documento visualizado, listo para imprimir:




Resumen

  • La orden :hardcopy permite enviar a la impresora el documento actual. El resultado de :hardcopy se puede redirigir a un fichero postscript, en lugar de a la impresora, mediante la orden :hardacopy >nombre-fichero.

  • Vim contiene una ayuda en línea muy completa sobre su uso, a la cual se accede mediante la orden :help.

  • Para acceder a las órdenes de HAL desde dentro de Vim se utiliza la orden :!orden_de_HAL, donde orden_de_HAL es una orden que HAL entiende.

  • La orden :r, abreviatura de :read, lee el fichero que se le da como argumento y lo introduce en el documento que se está editando. Una variante común de esta orden es la que recibe como argumento la salida de una orden de HAL. Por ejemplo, :r ! date introduce en el documento que se está editando la salida de la orden date de HAL.

2 comentarios:

  1. ¿Qué hardstatus tienes en tu .screenrc?

    Lo siento por salirme del tema pero, tras ver la captura de pantalla, no puedo dejar de pensar "quiero ver su .screenrc" :-)

    Por cierto, habrá un capítulo "HAL y screen", ¿verdad?

    ResponderEliminar
  2. Aquí lo tienes :-)

    hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r} (%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m/%y %{W}%c %{g}]'

    La verdad, ahora sería incapaz de reconstruir el proceso que me llevó a editar esto. Creo recordar que una gran parte lo tomé de algún sitio y luego tuve que adaptar algunos detalles.

    Sobre lo de HAL y screen, ya veremos. Queda mucho para llegar ahí, me temo ;-)

    Por cierto, esta sesión de screen corre ---quién lo diría--- sobre konsole (versión de kde4) adaptada para que no ocupe toda la pantalla entera y sin ninguna decoración. Hablé del tema aquí hace algún tiempo.

    N.B. El lector que no sepa de qué estamos hablando puede echar un vistazo a la página del proyecto GNU Screen, que, sin duda, es un as entre los ases de la consola.

    ResponderEliminar