El Editor JOE
(Copyleft 2002 Arturo 'Buanzo' Busleiman <[email protected]>)
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 ANIOS
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,
Miscelaneos, 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 elejir 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"
BUSQUEDAS 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.
BUSQUEDAS Y REEMPLAZOS... PERO MAS 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.