JOE

Hoy en esta seccion vamos a hablar un poco sobre un editor de texto que no es ni el vi, ni el emacs, ni el mcedit. Vamos a hablar de mi editor de textos para consola favorito, el cual vengo utilizando hace MUCHOS AÑOS para programar y con el cual escribo los articulos de USERS y Raregazz.

Muchos dicen: "pero si no usas vim [o emacs] no sos Linuxerooooo". Bue. No creo que esto sea asi. Lo que si puedo decir es que, si sabes "vi", podes editar en cualquier Unix o derivado existente. Eso es una ventaja, por supuesto. En mi caso, y estoy hablando puramente de preferencias personales, opino que el "JOE" es impresionante. No hay casi nada que no se pueda hacer con este editor: incluso soporta la utilizacion de metacaracteres y expresiones regulares en las busquedas cosa que, combinada con la capacidad de grabar "macros", nos permite realizar tareas de modificacion de textos muy interesantes.

Por ejemplo: transformar el archivo /etc/passwd en un comando SQL para cargar una tabla de alguna base de datos. A decir verdad este articulo lo estoy escribiendo en mi trabajo (que mi jefe no se entere!) utilizando, obviamente, el joe. De hecho SI lo utilice para generar comandos SQL, asi que no les estoy mintiendo. El joe se incluye con las distribuciones mas utilizadas en nuestra region, como Slackware (de hecho, gracias a Slackware conoci al joe, durante mi primer instalacion alla por el 94 o 95, el nombre me resulto simpatico y al probarlo me encanto), SuSE, Mandrake. En el caso de Debian, un simple "apt-get install joe" es mas que suficiente, aunque supongo que algunos preferirian utilizar dselect. OK, basta de presentaciones, y pongamos dedos en el teclado, porque ha llegado la hora de tipear.

Interfaz

Es una interfaz simple, no tiene menues. Lo mas avanzado como menues son las opciones que aparecen al utilizar el comando CONTROL+T (de ahora en mas, ^T), donde podemos movernos con los cursores y apretar enter. De hecho, cada vez que el programa nos quiera pedir algo, sea un nombre de archivo, movernos por un menu, tipear algun parametro, lo va a hacer en la linea numero 24 de la pantalla.

La primer linea es de estado del archivo actual siendo editado: Linea actual, columna, nombre, estado (Modificado, etc). Tambien nos recuerda cual es el comando para obtener ayuda (^KH, que se lee como ^K, y luego H).

Hablando de la ayuda, esta se presenta como un cuadro permanente estilo "MEMO", recordatorio de los comandos, separados en categorias (Manejo de Bloques, Archivos, Posicionamiento, Busquedas, Misceláneos, etc).

Editando archivos

Podemos iniciar el joe indicando que archivos queremos editar en la linea de comandos ("joe archivo1.txt codigo.c", lo que iniciara joe con la pantalla dividida en dos 'ventanas', mas sobre ventanas ahora enseguida). Tambien podemos directamente ejecutar 'joe' y luego cargar un archivo a editar, con el comando ^KE (Primero Control+K, luego E).

Ahora, el manejo de ventanas es bastante interesante. Para abrir una ventana, lo hacemos con ^KO. Y como hacemos para cargarle un archivo a la ventana actual? ^KE otra vez. O sea, los comandos actuan sobre la ventana actual. En la jerga emacs seria sobre el "buffer" actual. Para cambiar entre ventanas, los comandos ^KN (ventana siguiente) y ^KP (ventana previa) nos van a venir como anillo al dedo. De hecho, estos dos comandos ^KN y ^KP nos permiten movernos entre todos los lugares donde el joe nos esta solicitando "INPUT", o sea, teclear algo. Por ejemplo, en este momento tengo los comandos de busqueda en la linea de estados, y puedo elegir continuar trabajando con la busqueda o con el texto, simplemente moviendome entre las dos "areas" con ^KN o ^KP.

Por supuesto, tenemos los tipicos comandos para eliminar la linea actual completamente: ^Y (no ^KY, atencion!), o para eliminar desde la posicion actual hasta el final de la linea: ^J. Para grabar el archivo cargado en la ventana actual, podemos utilizar ^KD lo cual nos pedira el nombre de archivo. Y si queremos grabar y salir, sin preguntas, ^KX es nuestro comando. Para salir del joe tenemos ^KQ, y para suspender la sesion y volver con el comando 'fg', tenemos el ^KZ.

No voy a ponerme a hacer un raconto de los comandos, sino mas bien una breve presentacion del Joe, siguiendo por las dos caracteristicas mas avanzadas e interesantes: busquedas/reemplazos y macros. Revisen la ayuda (^KH, que tiene varias ventanas por las cuales se pueden mover con "ESCAPE ." y "ESCAPE ,"; o sea, apretar la tecla escape, luego la coma o el punto. Para cerrarla, otra vez ^KH).

Para grabar el archivo cargado en la ventana actual, podemos utilizar ^KD lo cual nos pedira el nombre de archivo. Y si queremos grabar y salir, sin preguntas, ^KX es nuestro comando. Para salir del joe tenemos ^KQ, y para suspender la sesion y volver con el comando 'fg', tenemos el ^KZ"

Búsquedas y reemplazos

A la hora de hacer busquedas, y luego tal vez reemplazar lo que vamos encontrando, el joe tiene amplias capacidades que deberiamos aprovechar, y que, de hecho vamos a querer aprovechar. Recuerdo que al ir conociendolas deseaba encontrar una situacion real (y no 'prefabricada' digamos) donde utilizar estos metodos. Cuando finalmente tuve que hacerlo ni me di cuenta.

Por ejemplo, si lo que queremos es buscar la primer ocurrencia de alguna palabra desde la posicion actual, entonces hariamos lo siguiente: ^KF (por "Find"). Nos aparecera un prompt con opciones: ingresaremos la palabra a buscar, por ejemplo "gnu". Luego de apretar enter nos vamos a encontrar con una serie de opciones: (I)gnorar diferencias entre mayusculas y minusculas (lo que encontrara tanto GNU, como gnu, como GnU), (R)eemplazar (lo que nos habilitara la opcion de "Buscar y Reemplazar", digamos), (B)uscar para atras (en vez de la proxima ocurrencia, la previa), Buscar en el Bloc(K)e actual o buscar la ocurrencia numero "NNN". Esto ultimo nos sirve para casos donde el texto tenga algun formato rigido especial. En el caso de (R)eemplazar, nos solicitara el texto con el cual se va a reemplazar el texto buscado. Si se encuentra el texto, se nos preguntara si queremos reemplazarlo, respondiendo "Y" para "si", "N" para "no", y "R" para "reemplaza todo, hermano, y no me preguntes mas nada". Si queremos dejar de buscar y reemplazar, ^C y listo. Ah, y pueden repetir la busqueda/reemplazo con solo presionar ^L.

Búsquedas y reemplazos... pero más pulenta

Existen ciertos caracteres especiales que podemos utilizar a la hora de hacer busquedas mas complejas, y reemplazos mas interesantes. A este tipo de caracteres especiales, que son mas bien cadenas, se las llama "expresiones regulares", y se utilizan en muchisimos lenguajes de programacion. Claro esta, joe tiene una sintaxis un tanto diferente y un poco mas limitada, pero para el tratamiento de textos es mas que suficiente. Veamos algunos ejemplos para entenderlo mejor. Les recomiendo tambien que hagan un "info joe" o "man joe".

Para buscar utilizando el comodin "*", ampliamente conocido por todos ustedes, solo deben hacerlo de la siguiente forma: \* - Entonces, si ingresamos "A\*B" se buscara algo que empiece con "A", termine con "B" y tenga cualquier cosa (incluso nada), en el medio.

Para buscar utilizando el comodin "?", lo haremos igual: \?. Entonces, siguiendo el mismo ejemplo, si utilizamos "A\?B" como busqueda, joe encontrara un "AxB", "A3B", pero no "AB" o "A123B". O sea, toma UN caracter, cualquiera excepto 'nada', pero UN SOLO caracter.

Si quiero buscar una linea que empiece con cierta palabra, usariamos \^PALABRA.

Si quiere buscar una linea que TERMINE con cierta palabra, usariamos PALABRA\$ (y no \$PALABRA, atencion).

Entonces, si queremos buscar una linea que solo sea esa palabra, buscariamos \^PALABRA\$

Tenemos un funcionamiento similar para palabras en vez de lineas, y lo hacemos con \< y \>. Ejemplo: Buscar palabras que tengan 'te' en el medio: \<\*te\*\> - Miren este ejemplo bien, que mezcla con \*.

Existen otras expresiones regulares para las busquedas, pero voy a pasar a los reemplazos, ya que me quedo sin espacio.

Si quieren modificar lo que buscamos de alguna forma en especial, miren como usar ^& (que se reemplaza por lo que buscamos) en este ejemplo: Si usan \<\*\> ("cualquier PALABRA") como cadena de busqueda, y ponen "^&" (comillas incluidas) en la cadena de reemplazo, encerraremos cada palabra entre comillas.

Si usamos \NUMERO (\0, \2, \9, etc) podemos referirnos al elemento \* o \? (o alguno de los no comentados aqui) para cambiar el orden. Ejemplo: si tenemos un archivo con lineas: Nombre: bla bla DNI: Blabla, podemos dar vuelta las columnas asi: busquemos Nombre:\*DNI:\* y reemplacemos por DNI:\1Nombre:\0 y listo, quedaran como DNI: blabla Nombre: blabla.

Saludos y hasta la proxima.