jueves, 5 de marzo de 2009

HAL y vim (VIII)

De la serie de menús de un procesador de textos nos queda únicamente por ver el menú "Herramientas". Proponemos de nuevo un menú genérico, por las razones explicadas en la introducción al artículo pasado.

Un menú "Herramientas" podría contener las siguientes funciones:

Corrección ortográfica
Corregir los errores ortográficos.

Ordenar
Ordenar alfabéticamente el texto seleccionado.

Mayúsculas/Minúsculas
Convertir el texto seleccionado en mayúsculas o en minúsculas.


Probablemente debería contener también una función relativa a la indentación. Pero puesto que, aun siendo ésta una característica crucial para un programador, no se da por hecho que el principiante quiera o vaya a programar, la omitiremos de nuestra exposición.

La corrección ortográfica es una de las funciones estelares de los procesadores de texto. Los editores han ido integrándola en su propia interfaz, quizá como consecuencia del tirón que ha tenido en aquéllos. Sin embargo, se puede delegar perfectamente en herramientas especializadas externas al propio editor o, como sabemos, en ayudantes de HAL expertos en la materia. Ésta es la aproximación que realizaremos aquí. Sobra decir que, como consecuencia, omitimos toda referencia a una corrección al vuelo, muchas veces más molesta que eficaz, y nos concentramos en una corrección explícitamente solicitada tras la redacción y escritura del texto o de una parte significativa de él.

El ayudante de HAL a quien nos dirigiremos para solicitar la corrección se llama aspell y puede venir instalado por defecto en nuestra distribución. En caso de que no lo esté, hay que instalar al menos dos paquetes: el revisor ortográfico (paquete aspell) y el diccionario del idioma en el que escribiremos (paquete aspell-es, para el castellano):

aptitude install aspell aspell-es

La sintaxis de la orden aspell que nosotros utilizaremos es la siguiente:

aspell check nombre_de_fichero --lang=idioma [--mode=tipo_de_fichero]

O, en formato corto y sin determinación del tipo de fichero:

aspell -c nombre_de_fichero -l idioma

Las dos primeras opciones -c y -l indican el fichero cuya ortografía se quiere revisar (check) y el idioma (language) cuyo diccionario se utilizará para realizar la corrección.

--mode es opcional. Su sentido es que podamos corregir documentos escritos en ciertas lenguas artificiales, documentos que se almacenan en ficheros de tipos especiales. La utilidad de esta opción es evidente. Imaginemos que nuestro documento es una página web en griego. Aparte del texto en griego, que es lo que tenemos delante cuando navegamos por ella, aparecerán etiquetas html que identifican y definen la estructura y otras características visuales. Estas etiquetas son las que analiza el navegador para mostrar la página tal como la vemos. Cualquier usuario puede visualizar esas etiquetas abriendo el código fuente de una página cualquiera en su navegador (la opción se encuentra en el menú "Ver" de los navegadores). Si le pedimos a aspell que compruebe la ortografía de este código fuente revisará no sólo nuestro texto en griego normal y corriente, sino también un número bastante grande de etiquetas html no incluidas en su diccionario de griego. Como consecuencia, nos solicitará continuamente que corrijamos las palabras que constan en tales etiquetas. Para evitar este molesto comportamiento existe la opción --mode=html o en versión corta, simplemente -H. Gracias a esta opción aspell pasará por encima de todas las etiquetas html y se concentrará exclusivamente en la revisión del texto en griego.

Veamos, en conclusión, cuáles serían las órdenes concretas que habría que dar a HAL para que aspell ejerza sus funciones correctoras sobre tipos de documentos que un usuario español no programador puede querer revisar en algún momento de su existencia [Se indican sólo las versiones cortas de las órdenes]:

aspell -c mi_documento -l es
Revisa mi_documento, que contiene sólo texto normal y corriente.

aspell -c mi_mensaje -l es -e
Revisa mi_mensaje, que es un mensaje de correo electrónico.

aspell -c mi_página.html -l es -H
Revisa mi_página, una página web escrita en html.

aspell -c mi_libro.tex -l es -t
Revisa mi_libro, que es un libro etiquetado con LaTeX.


Una vez conocida la forma de informar a aspell sobre lo que queremos hacer, requerir su presencia en Vim es casi trivial. Lo hemos hecho ya con otros ayudantes de HAL. Decimos "casi", porque hay dos detalles más que tener en cuenta. El primero es la forma de indicar a aspell que el documento que deseamos que corrija es justamente el que estamos editando. Para ello utilizamos el comodín '%' en el lugar donde en la orden aspell debe ir el nombre de fichero. Cuando aspell vea el comodín lo sustituirá por el fichero que actualmente editamos. Por tanto, la forma de llamar a aspell sería:

:!aspell -c % -l es

El segundo detalle ---no exclusivo de aspell, sino característico de llamadas a cualquier orden externa que reciba como argumento el documento actual--- es que resulta necesario guardar los cambios que se hayan realizado en el documento antes de llevar a cabo la corrección. Existe una opción de configuración de Vim para automatizar esta acción. Sin embargo, procederemos guardando los cambios explícitamente:

:w
:!aspell -c % -l es

Tras estas dos órdenes, aspell se pondrá en funcionamiento y nos mostrará una interfaz que no requiere comentario, debido a su sencillez. Completada la revisión y si se han producido correcciones, Vim nos notificará que el fichero ha cambiado y que deberemos volver a escribir los cambios pulsando 'C' de 'Cargar' (o 'L' de 'Load', si nuestra variable de entorno LC_MESSAGES no está castellanizada).

La citada orden aspell se puede asociar a una tecla por el procedimiento descrito el día pasado:

:map <F4> <Esc>:!aspell -c % -l es<CR>

Podemos añadir también la instrucción previa de escritura en disco al principio de la orden que queremos asociar a F4 y evitarnos de este modo el trabajo de introducirla explícitamente.

:map <F4> <Esc>:w<CR>:!aspell -c % -l es<CR>

Finalmente, podemos solicitar la recarga del fichero revisado por aspell y hacer desaparecer el mensaje de advertencia de Vim antes comentado:

:map <F4> <Esc>:w<CR>:!aspell -c % -l es<CR>:e! %<CR>

(La orden :e carga ---edita--- el fichero dado como argumento. Por su parte, :e! lo carga, aunque ese fichero haya cambiado, que es justo lo que sucederá en nuestro caso, si se producen correcciones ortográficas.)

Las otras dos funciones del menú "Herramientas", la de sustituir minúsculas por mayúsculas y viceversa, y la de ordenar alfabéticamente un fragmento del texto son relativamente triviales en Vim.

Para pasar un carácter de mayúscula a minúscula, y viceversa, se pulsa la tilde desde el modo de órdenes:

~

Para convertir en mayúsculas otros objetos de texto disponemos de una orden genérica, gU, seguida de un tecla de movimiento; o de órdenes especiales, que contienen gU como prefijo.

Por ejemplo, para que Vim ponga en mayúsculas una palabra del texto, la orden sería [suponemos que el cursor está al principio de la palabra]:

gUw

Para que actúe sobre una línea completa, diríamos [suponemos que el cursor está al principio de la línea]:

gU$

O también de esta otra forma [el cursor puede estar en cualquier parte de la línea]:

gUU

Las órdenes para pasar de mayúscula a minúscula son semejantes, pero con la 'u' minúscula en lugar de mayúscula. O sea:
'guw', 'gu$' y 'guu', respectivamente.

En cuanto a la ordenación alfabética de un texto seleccionado podemos recurrir a una orden de HAL conocida, la orden sort y llamarla desde Vim como hemos hecho con otras órdenes externas a él. En este caso, habría además que prefijar la llamada a sort con una indicación de la dirección sobre la que se aplicará la orden. Por ejemplo para que se aplique al rango de líneas 5-10:

:5,10 !sort

Vim proporciona una orden sort propia que emula el comportamiento de la orden sort de HAL. La orden anterior con este sort de Vim es prácticamente la misma:

:5,10 sort

El sort de Vim, del mismo modo que el de HAL, puede matizarse de distintas formas; por ejemplo, para que no tenga en cuenta la diferencia entre mayúsculas y minúsculas:

:5,10 sort i


Resumen:

  • aspell es el ayudante de HAL para la revisión ortográfica.

  • La sintaxis de una orden aspell para la revisión ortográfica de un fichero de texto normal es aspell check nombre_de_fichero -l idioma, donde la opción -l define el idioma del diccionario que se usará para revisar el fichero indicado.

  • Cuando el fichero que va a revisar aspell es un mensaje de correo, un fichero escrito en html o un fichero (La)TeX se usa una opción especial con el fin de que aspell no revise las palabras clave del código correspondiente. Estas opciones son, respectivamente, -e, -H y -t.

  • Una forma de revisar la ortografía de nuestro texto desde Vim es recurrir a un experto de HAL en la materia, como aspell. En tal caso, el comodín '%' deberá darse como el argumento de aspell check. Por ejemplo: :!aspell check % -l es.

  • Antes de ejecutar aspell desde Vim sobre el documento actual se deben escribir en disco los cambios efectuados en él. Esto vale en general para cualquier orden externa que actúe sobre el fichero que contiene el documento.

  • Para convertir un carácter de mayúscula a minúscula o vicerversa se usa la orden ~ (carácter tilde).

  • Para convertir cualquier objeto de texto de mayúscula a minúscula y viceversa se usan órdenes que contienen el prefijo gU o, respectivamente, gu. Por ejemplo: gUw convierte en mayúsculas las minúsculas desde la posición del cursor hasta el final de la palabra actual; gUU realiza la misma conversión para todos los caracteres de la línea actual. Las órdenes guw, guu sirven mutatis mutandis para convertir minúsculas en mayúsculas.

  • Para ordenar alfabéticamente un fragmento del texto editado se puede utilizar la orden :sort, que debe incluir una especificación de dirección. Por ejemplo, :5,10 sort i ordena alfabéticamente las líneas entre la 5 y la 10, inclusives, sin tener en cuenta si contienen mayúsculas o minúsculas (opción i).

No hay comentarios:

Publicar un comentario