¡Esta es una revisión vieja del documento!
Editor Contextual Compatible de Edimburgo
El Editor Contextual Compatible de Edimburgo (ecce) es un editor de texto basado en líneas escrito a finales de la década de 1960 para las terminales teletipo de la minicomputadora PDP-10. El original fue escrito en lenguaje BCPL por Hamish Dewar, pero ha sido reescrito al lenguaje C en 1984.
Ecce fue uno de los primeros editores conocidos como “modales” (con modo de inserción y de comandos). Inspiró a vi y durante mas de 25 años incitó culto entre los entornos multiusuario.
Si bien su almacén es limitado (768 kilobytes), es suficiente para unas 350 páginas de texto aproximadamente.
Uso de Ecce
Ejecución de Ecce
Si bien la sintaxis básica para editar un fichero es:
ecce fichero
Si bien normalmente querrías utilizar un fichero de texto muleto para evitar cometer errores, notarás que Ecce es tan antediluviano que es incapaz de crear uno de forma autónoma (en caso de que este no exista ya). Por lo tanto deberás recurrir a elaborar un fichero en blanco con touch, indicando un fichero origen.txt. Por ejemplo:
touch fichero.txt ; ./ecce origen.txt destino.txt
ecce fichero_origen fichero_destino
Prompts de Modo
Al iniciar, Ecce presentará en la terminal el tamaño de memoria disponible para su almacén (“buffer”), y aguardará órdenes:
Espacio de buffer = 768 KBytes Ecce >
Durante su operación, Ecce puede presentar alguno de sus dos prompts modales:
- Prompt del Modo de Comandos:
> - Prompt del Modo de Inserción de texto:
:
Edición básica
Para la introducción básica de texto basta conocer sólo cuatro comandos de una letra.
| Comando | Acción |
|---|---|
g | Agregar una línea de texto individual |
: | Detiene el modo de inserción |
m | mueve el puntero a la línea siguiente |
p | Imprime la línea actual |
En el prompt de comandos > introduce el comando g (“agregar una línea individual”) y presiona la tecla Intro.
En el caso de UNIX, la línea equivale a un párrafo entero, que puede tener más de los 80 o 132 caracteres tradicionales de una línea impresa en papel.
Comprueba que ha aparecido un prompt de inserción texto en forma de : (esto indica que aguarda que introduzcas el texto para la línea). Ante este prompt : mecanografía la línea de texto deseado, y al finalizarla presiona la tecla Intro para almacenarla en el Almacén.
Si es necesario, puedes repetir la operación para agregar otra línea individual.
Si en lugar de g en el prompt de comandos > introduces el comando g* (“agregar líneas indefinidamente”), Ecce te permitirá continuar agregando líneas indefinidamente. Una vez que hayas finalizado la inserción de la(s) línea(s) de texto deseadas desde el prompt de inserción de texto, detén el modo de inserción ingresando :. Volverás al prompt de comandos >.
Al llegar al fin del documento de una sola línea recibirías el mensaje *** FIN *** y volverás al prompt de comandos >.
Guardar y salir
Podrás guardar los cambios en al fichero destino y cerrar el editor desde el prompt de comandos >, introduciendo el comando %c.
Movimiento y corrección
Imagina a Ecce como una antigua máquina de escribir, en las cuales al girar el rodillo se avanza o retrocede en las líneas.
Para alterar la posición actual de edición en el documento (llamada “puntero”) se utiliza el comando m (“mover”). Por si solo avanza una línea, pero si antepones el con el signo - podrás retroceder una línea. Si lo combinas con una cifra, podrás avanzar o retroceder una determinada cantidad de líneas.
Si utilizas el modificador *, podrás avanzar de forma indefinida hasta llegar al final del documento (o hasta el principio, si utilizas por ejemplo m-*).
Recuerda que al llegar al fin del documento recibirás como indicación el mensaje *** FIN ***.
Comandos de Movimiento
| Comando | Movimiento del Puntero |
|---|---|
m | Mueve el puntero a la línea siguiente |
m- | Mueve el puntero a la línea anterior |
r | Mueve el puntero un carácter a la derecha (en la línea actual) |
l | Mueve el puntero un carácter a la izquierda (en la línea actual) |
g[nro] | Va a la línea {nro} |
* o 0 | Repetición indefinida (“repite la acción no poder cumplir mas”) |
Comandos de corrección básica
| Comando | Borrado realizado |
|---|---|
k | Elimina la línea actual del puntero |
k- | Elimina la línea anterior al puntero |
o/texto | Sobreescribe la línea actual del puntero con la cadena texto |
e | Borra un carácter a la izquierda del puntero |
e- | Borra un carácter a la derecha del puntero |
i/texto | Inserta la cadena texto a la izquierda del puntero |
i-/texto | Inserta la cadena texto a la derecha del puntero |
g/texto | Tras del puntero, Agrega una línea nueva que contiene la cadena texto |
g-/texto | Tras del puntero, Agrega una línea nueva que contiene la cadena texto |
d/texto | En la línea actual, borra la primer iteración de la cadena texto tras el puntero |
d-/texto | En la línea anterior, borra la iteración previa de texto |
t/texto | Busca en la línea actual texto y desplaza el puntero inmediatamente a si derecha |
d/texto | Borra la cadena texto (en la línea actual) |
u/texto | Borra hasta la cadena texto (en la línea actual) |
Buscar y reemplazar
Para esta operación se utilizan dos comandos:
f/cadena1/ | A partir del puntero, buscará cadena1 en todo el fichero. |
s/cadena2 | Tras usar f/cadena1, la reemplaza con cadena2 |
Comandos Especiales
Los comandos especiales de Ecce se utilizan para funciones
| Comando especial | Resultado |
|---|---|
%c | Guarda los cambios y sale del editor |
%a | Abandona la edición y sale del editor |
%v | Imprime la versión de Ecce |
Edición Avanzada
Junto a los comandos de una letra simple, Ecce dispone la posibilidad de usar opciones más avanzadas que te permiten editar con mayor conveniencia.
Como regla general, si introduces un número n junto a tu comando, y ejecutarás dicho comando recursivamente n veces. Por ejemplo:
p23 | Imprime las 23 líneas siguientes al puntero |
m10 | Sube el puntero diez líneas |
g5 | Deja 5 líneas de texto en blanco debajo del puntero |
De la misma manera es posible invertir el orden del comando antecediendo al número n con un signo -. Por ejemplo:
p* | Imprime todo desde el puntero hasta el final del texto |
p-23 | Imprime las 23 líneas anteriores al puntero |
p-* | Imprime todo hasta el inicio del texto |
m-10 | Retrocede el puntero diez líneas |
m-* | Retrocede el putnero todas las líneas (vuelve al inicio del texto) |
Como en el caso anterior, estos pueden repetirse indicándole números apropiados:
f/texto/4 | Busca la 4ta. iteración de “texto” |
r40 | Mueve a la derecha 40 caracteres |
Estas órdenes pueden encadenarse juntas:
m23 f/texto/ p3
Comandos de Edición Avanzada
a | Ajusta el largo |
b | Divide la línea en dos insertando un caracter de nueva línea en el puntero |
C | Cambia mayúsculas con Shift derecho |
C- | Cambia a minúsculas con shift izq |
q | Transporta la línea actual a la posterior |
g- | Transporta la línea actual a la anterior |
j | Une la línea del puntero a la siguiente línea |
u/texto | Busca en la línea actual desde el puntero hasta la primer iteración de texto, y borra todo lo intermedio |
Comandos Compuestos
Los comandos compuestos son secuencias de comandos cerrados entre paréntesis.
La utilidad de estos comandos está en su repetición en bucle, condicional o incondicional. Observa estos ejemplos:
| Operación | Ejemplo | Significado/efecto |
|---|---|---|
0 o * | Repetición indefinida (“repite hasta no poder cumplir mas”) | |
r0 | Mueve el puntero al final de la línea | |
(mr)0 | Busca la primer línea en blanco | |
e-0 | Borra hacia atrás hasta el comienzo de la línea | |
? | Ejecución opcional (se ignora la condición de falla) | |
((r61p)?m)0 | Imprime las líneas con no más de 60 caracteres | |
, | Ejecución alterna (“si el primer intento falla, ejecuta el siguiente, etc”) | |
(r81lb,m)0 | Divide las líneas con más de 80 caracteres | |
(f/River/(v/Bocado/,e5i/Boca/))* | “Reemplaza River con Boca excepto para Bocado” | |
\ | Falla invertida | |
(mv'+'\)0 | Busca la siguiente línea que comienza con `+ |
Si sólo introduces un número en la línea de comandos, Ecce repetirá el comando introducido anteriormente una n cantidad de veces.
Podrás delimitar patrones por cualquier caracter excepto letras, dígitos, y aquellos que tienen significación definida. Podrás usar: “, /, $, >, +, ., :, = y _

