El despertar del Dæmonio
2008-07-18 20:09:53-05
Hacks
Desde que me inicié en esto de Unix (como filosofía y no como la marca registrada UNIX®), el editor vi siempre ha sido para mi uno de los grandes y fascinantes enigmas .
No entendía el por qué de su naturaleza (un tanto chocante para el iniciado), sus modos, sus variantes, sus clones, las diferencias entre ellos, sus licencias, el por qué de tantos de ellos, etc., y sobre todo, la médula en la que se centra su edición y su naturaleza: el editor ex.
Para tratar de comprender mejor esta mantra me compré el libro “Learning the vi editor” junto con su versión de bolsillo de Arnold Robins, me leí de cabo a rabo (más o menos) la ayuda en línea del vim, la ayuda en línea de su otro clón: el Elvis (el vi oficial de los slackers y de donde se inspiró Keith Bostic para hacer el nvi, el "New VI", el vi *OFICIAL* de los *BSD), el man page del nvi de los BSD, el comando “:visuage” del nvi asi como tambien el comando “:exusage” y seguía sin poder comprender.
En fin, todo lo relacionado con vi/ex (y por lo ende, todo lo que sea relacionando con el editor estándar de Unix: el editor ed).
Hubo incluso un tiempo en que decidí engañarme y usar el otro mantra de Unix (que en realidad no nació en Unix sino en una PDP-10 que usaba el sistema operativo TOPS-10 y nació en Unix por la frustación de no poder asimilar el mantra de vi. Por eso me atrevo a decir que un usuario de Emacs es un usuario fracasado de vi en potencia. Si tan solo los usuarios fracasados del editor vi pudieran contarse con las... !momento! !ya se puede: vi vs emacs!), el editor Emacs y olvidarme de vi como aquél cuyo amor imposible hace que se olvide de la mujer que tanto quiso pero que nunca le pudo o hubo manera de entregarle todo el amor que sentía por ella.
Incluso imprimí todo sus manuales porque tenía las esperanzas falsas de que en este mantra finalmente iba a encontrar mi felicidad hasta que una noche cansado de hacer tantas “muecas” con las manos por presionar las teclas del “método abreviado” tan mamones que tiene este editor decidí volver derrotado una vez más para ver si en esta ocasión podía conquistar el amor de vi/ex de una vez por todas.
Todas las noches leía con vehemencia el manual del editor Sam, la versión oficial y gráfica del editor ed para el que iría ser el sucesor de Unix pero por falta de tiempo no lo fue (jubilaron a los desarrolladores): el sistema operativo Plan 9, pero no me cabía en la cabeza cómo es que alguien pudiera siquiera preferir un editor de “líneas” a un editor normal, hice miles de anotaciones, leía y leía sin comprender hasta que un día...
Suponiendo que vas a escribir un sencillo programa en C:
Pero suponiendo que por algún motivo ya no vamos querer la salida estándar (“stdout”) para mostrar el saludo sino la salida estándar de error (“stderr”).
He aqui el meollo de vi/ex y ed:
Con un editor normal habriamos que presionar la tecla flecha abajo unas cinco veces y presionar la tecla flecha derecha unas 10 veces, dependendiendo claro si habriamos ocupado el shortcut de Ctrl+Flecha derecha, para saltarnos palabra por palabra hasta llegar al lugar del reemplazo.
Lo primero que tenemos que hacer con ed es “seleccionar” la linea que vamos a editar y eso lo conseguimos con
Segun Arnold Robins hay básicamente tres formas de poder seleccionar las líneas (digo, despues de todo ex y ed son “editores de líneas”):
Viéndolo gráficamente:
Con el comando “/printf” lo que hacemos es seleccionar la línea número 6, que es básicamente:
Despues de haber seleccionado la línea que buscamos le vamos a indicar que en esa línea realice una sustitución de texto, para eso usamos el siguiente comando:
Que es básiamente:
Si queremos comprobar que se haya realizado dicha sustitución o comprobar que se haya efectuado en el lugar que indicado, imprimimos el contenido de la dirección actual con el comando “p”:
Y vemos que satisfactoriamente el cambio se ha realizado.
Guardamos el archivo:
Compilamos:
Y ejecutamos:
Y ¡listo! Esta es la manera, expresado de la manera más simple, en la que ed/ex o cualquier otro editor de líneas operan.
Lo que hace muy poderoso a un editor de líneas es la posibilidad de poder usar las expresiones regulares (esas todavía me hacen falta por comprender) como por ejemplo, del libro de Arnold Robins:
Tenemos la siguiente base de datos:
Y queremos cambiar el orden de los nombres:
Sólo con teclear el siguiente poderoso comando con la siguiente poderosa expresión regular:
realizamos dicha tarea.
Por cierto, ed y ex son tan diferentes como un hombre y una mujer así que el juego de comandos de ed varia un poco en ex y viceversa.
Cuando nos encontramos en vi (que es solamente el modo visual de ex) todos los comandos de ex tienen que llevar implicito los dos puntos (“:”) para indicar que no es un comando del modo visual sino de ex propiamente. Como cuando guardamos un archivo:
Y cuando nos encontramos en ex, el editor automáticamente los agrega:
Y pues bien, esto fue, expresado en mis propias palabras, mi iluminación con ed/ex.
No entendía el por qué de su naturaleza (un tanto chocante para el iniciado), sus modos, sus variantes, sus clones, las diferencias entre ellos, sus licencias, el por qué de tantos de ellos, etc., y sobre todo, la médula en la que se centra su edición y su naturaleza: el editor ex.
Para tratar de comprender mejor esta mantra me compré el libro “Learning the vi editor” junto con su versión de bolsillo de Arnold Robins, me leí de cabo a rabo (más o menos) la ayuda en línea del vim, la ayuda en línea de su otro clón: el Elvis (el vi oficial de los slackers y de donde se inspiró Keith Bostic para hacer el nvi, el "New VI", el vi *OFICIAL* de los *BSD), el man page del nvi de los BSD, el comando “:visuage” del nvi asi como tambien el comando “:exusage” y seguía sin poder comprender.
En fin, todo lo relacionado con vi/ex (y por lo ende, todo lo que sea relacionando con el editor estándar de Unix: el editor ed).
“...y al buscar, en el aliento de otras bocas, el perfume que engañara mis tristezas...”.
— Canción popular, Falsa.
— Canción popular, Falsa.
Hubo incluso un tiempo en que decidí engañarme y usar el otro mantra de Unix (que en realidad no nació en Unix sino en una PDP-10 que usaba el sistema operativo TOPS-10 y nació en Unix por la frustación de no poder asimilar el mantra de vi. Por eso me atrevo a decir que un usuario de Emacs es un usuario fracasado de vi en potencia. Si tan solo los usuarios fracasados del editor vi pudieran contarse con las... !momento! !ya se puede: vi vs emacs!), el editor Emacs y olvidarme de vi como aquél cuyo amor imposible hace que se olvide de la mujer que tanto quiso pero que nunca le pudo o hubo manera de entregarle todo el amor que sentía por ella.
Incluso imprimí todo sus manuales porque tenía las esperanzas falsas de que en este mantra finalmente iba a encontrar mi felicidad hasta que una noche cansado de hacer tantas “muecas” con las manos por presionar las teclas del “método abreviado” tan mamones que tiene este editor decidí volver derrotado una vez más para ver si en esta ocasión podía conquistar el amor de vi/ex de una vez por todas.
Todas las noches leía con vehemencia el manual del editor Sam, la versión oficial y gráfica del editor ed para el que iría ser el sucesor de Unix pero por falta de tiempo no lo fue (jubilaron a los desarrolladores): el sistema operativo Plan 9, pero no me cabía en la cabeza cómo es que alguien pudiera siquiera preferir un editor de “líneas” a un editor normal, hice miles de anotaciones, leía y leía sin comprender hasta que un día...
Suponiendo que vas a escribir un sencillo programa en C:
- Abres una ventana del emulador de terminal y tecleas:
[$] ed
y te aparece lo siguiente:
¡Nada porque aún no hay nada escrito!
- Para empezar a escribir el código fuente es necesario decirle a ed que vamos a agregar texto, para eso usamos el comado “a” (del inglés “append”, ¡d'oh!):
a
- Y empezamos a hackear:
#include
main (int argc, char* argv[])
{
fprintf (stdout, "Hello, world!\n");
return (EXIT_SUCCESS);
}
main (int argc, char* argv[])
{
fprintf (stdout, "Hello, world!\n");
return (EXIT_SUCCESS);
}
- Ahora vamos a detener la inserción de texto para poder guardar el archivo:
.
por cierto, es un sólo punto (“.”).
- Guardamos con el comando “w” (“write”) más el nombre del archivo:
w main.c
116
116
El número que aparece enseguida es el total de bytes que ed guardó en el disco.
- Compilamos:
[$] gcc -o saludo main.c
main.c: In function 'main':
main.c:6: error: 'EXIT_SUCCESS' undeclared (first use in this function)
main.c:6: error: (Each undeclared identifier is reported only once
main.c:6: error: for each function it appears in.)
main.c: In function 'main':
main.c:6: error: 'EXIT_SUCCESS' undeclared (first use in this function)
main.c:6: error: (Each undeclared identifier is reported only once
main.c:6: error: for each function it appears in.)
Y vemos con tristeza que por las prisas nos hemos olvidado de agregar la cabecera estándar “stdlib.h” para el “EXIT_SUCCESS”.
- Ahora editamos el archivo:
[$] ed main.c
- Y le inidicamos que en la línea número 1 le vamos a agregar texto:
1a
- y corregimos:
#include
- Detenemos la inserción de texto:
.
Recuerda, es un sólo punto (“.”).
- Compilamos y probamos:
[$] gcc -o saludo main.c
[$] ./saludo
Hello, world!
[$] ./saludo
Hello, world!
Pero suponiendo que por algún motivo ya no vamos querer la salida estándar (“stdout”) para mostrar el saludo sino la salida estándar de error (“stderr”).
He aqui el meollo de vi/ex y ed:
Con un editor normal habriamos que presionar la tecla flecha abajo unas cinco veces y presionar la tecla flecha derecha unas 10 veces, dependendiendo claro si habriamos ocupado el shortcut de Ctrl+Flecha derecha, para saltarnos palabra por palabra hasta llegar al lugar del reemplazo.
Lo primero que tenemos que hacer con ed es “seleccionar” la linea que vamos a editar y eso lo conseguimos con
/printf
Segun Arnold Robins hay básicamente tres formas de poder seleccionar las líneas (digo, despues de todo ex y ed son “editores de líneas”):
- De manera explícita através del número de línea.
- Con símbolos que te ayuden a especificar el número de línea apartir de la dirección actual.
- Por medio de expresiones regulas (“regexp”), que es el método mas eficaz, poderoso y confuso y es el que usamos con “/printf”).
Viéndolo gráficamente:
| 1 |
#include |
| 2 |
#include |
| 3 |
|
| 4 |
main (int argc, char* argv[]) |
| 5 |
{ |
| 6 |
fprintf (stdout, "Hello, world!\n");
|
| 7 |
return (EXIT_SUCCESS);
|
| 8 |
} |
Con el comando “/printf” lo que hacemos es seleccionar la línea número 6, que es básicamente:
- “/” <- Busca
- “printf”<- La expresión regular indicada.
| 1 |
#include |
| 2 |
#include |
| 3 |
|
| 4 |
main (int argc, char* argv[]) |
| 5 |
{ |
| 6 |
fprintf (stdout, "Hello, world!\n");
|
| 7 |
return (EXIT_SUCCESS);
|
| 8 |
} |
Despues de haber seleccionado la línea que buscamos le vamos a indicar que en esa línea realice una sustitución de texto, para eso usamos el siguiente comando:
s/stdout/stderr/
Que es básiamente:
- “s/” <- Realiza un reemplazo de
- “stdout/” <- La siguiente expresión regular por
- “stderr/” <- La siguiente expresión regular.
| 1 |
#include |
| 2 |
#include |
| 3 |
|
| 4 |
main (int argc, char* argv[]) |
| 5 |
{ |
| 6 |
fprintf (stderr, "Hello, world!\n");
|
| 7 |
return (EXIT_SUCCESS);
|
| 8 |
} |
Si queremos comprobar que se haya realizado dicha sustitución o comprobar que se haya efectuado en el lugar que indicado, imprimimos el contenido de la dirección actual con el comando “p”:
p
fprintf (stderr, "Hello, world!\n");
fprintf (stderr, "Hello, world!\n");
Y vemos que satisfactoriamente el cambio se ha realizado.
Guardamos el archivo:
w
120
120
Compilamos:
[$] gcc -o saludo main.c
Y ejecutamos:
[$] ./saludo
Hello, world!
Hello, world!
Y ¡listo! Esta es la manera, expresado de la manera más simple, en la que ed/ex o cualquier otro editor de líneas operan.
Lo que hace muy poderoso a un editor de líneas es la posibilidad de poder usar las expresiones regulares (esas todavía me hacen falta por comprender) como por ejemplo, del libro de Arnold Robins:
Tenemos la siguiente base de datos:
Name: Feld, Ray; Areas: PC, UNIX; Phone: 123-4567
Name: Joy, Susan S.; Areas: Graphics; Phone: 999-333
...
Name: Joy, Susan S.; Areas: Graphics; Phone: 999-333
...
Y queremos cambiar el orden de los nombres:
Name: Ray Feld; Areas: PC, UNIX; Phone: 123-4567
Name: Susan S. Joy; Areas: Graphics; Phone: 999-333
...
Name: Susan S. Joy; Areas: Graphics; Phone: 999-333
...
Sólo con teclear el siguiente poderoso comando con la siguiente poderosa expresión regular:
:g/^Name/s/: *\([^,]*\), \([^;*\);/: \2 \1;/
realizamos dicha tarea.
Por cierto, ed y ex son tan diferentes como un hombre y una mujer así que el juego de comandos de ed varia un poco en ex y viceversa.
Cuando nos encontramos en vi (que es solamente el modo visual de ex) todos los comandos de ex tienen que llevar implicito los dos puntos (“:”) para indicar que no es un comando del modo visual sino de ex propiamente. Como cuando guardamos un archivo:
:w calculo.c
Y cuando nos encontramos en ex, el editor automáticamente los agrega:
w calculo.c
Y pues bien, esto fue, expresado en mis propias palabras, mi iluminación con ed/ex.
Permalink: http://www.mononeurona.org/users/entry/asarch/1439
Comentblogs:1.-
asarch wrote:
Bill Joy, vi, and ed
In the editor wars, Emacs proponents used to say, "even Bill Joy doesn't use vi anymore."
In a 1984 interview[1] Bill Joy explained that, at Sun, he used an early desktop publishing program, called Interleaf; when visiting labs outside Sun, he used plain old ed. Although vi was almost ubiquitous, he could not count on the local version working the way he expected. However, ed was never modified, so he could count on making it work without making himself look like a fool.
2008-07-19 01:14:41-05
Bill Joy, vi, and ed
In the editor wars, Emacs proponents used to say, "even Bill Joy doesn't use vi anymore."
In a 1984 interview[1] Bill Joy explained that, at Sun, he used an early desktop publishing program, called Interleaf; when visiting labs outside Sun, he used plain old ed. Although vi was almost ubiquitous, he could not count on the local version working the way he expected. However, ed was never modified, so he could count on making it work without making himself look like a fool.
2008-07-19 01:14:41-05










