¿Cómo instalo los editores Ecce y EdLin en Ubuntu?

Su Quinta 17 de Octubre de Puerta de Hierro fue testigo de numerosos
encuentros del Conductor del Justicialismo con delegaciones del quehacer
político argentino. En una de las reuniones celebrada en 1969, Juan
Perón expone ante frondosa concurrencia acerca de compilar e instalar
los editores de texto modales Ecce y EdLin en Ubuntu.

¡Compañeros!

El nuestro es un Movimiento que está para darle a todos lo que merecen
por Justo derecho.

Todos sabemos que antes de organizarse en pos del Justicialismo, los
trabajadores argentinos daban comienzo a su mañana con mendrugos duros,
un mate cocido y grandes anhelos para acompañar. Esta fue la base previa
a la organización, que como consecuencia del obrar, elevaría esta
humilde dieta a la del chori al parquet de roble eslavonia.


Observarán que en el mundo del software sucede mas o menos el mismo
temperamento. No podemos crear de la nada absoluta, sino que debemos
edificar en base a ladrillos lógicamente concebidos y planificados en
una estructuración que va se impone de menor a mayor. Es así como yo
creo para crecer, y esta es la fomra como se ingenia en la vida.

Este norte cardinal acompaña también la noción creativa que nos requiere
la elaboración de un sistema operativo de potencia. Necesariamente
habremos de conjugar en código máquina tres herramientas de difícil
soslaye: un ensamblador que para generar código objeto, un intérprete de
comandos, y un editor que nos permita crear texto y corregir lo hecho.

Esto nos revela que la creación de texto pudo y debió hacerse con las
herramientas más básicas. En particular, los editores de texto
primordiales se iniciaron con una modalidad operativa que podríamos
describir como modal. Estos permitían introducir cadenas de caracteres
en un almacén de memoria, destinados a formar líneas de código, y más
adelante por conveniencia, cada línea definida así podría conformar
también un párrafo de texto.

Y si bien a partir de esto pueden hacerse mejores cosas, siempre es
bueno conocer lo pasado, para afirmarse en el presente y proyectarse
para el futuro. 

Ecce

Naturalmente yo inicié mis tareas con el Ecce, el Editor de Texto
Contextual de Edimburgo. Se trataba de un editor basado en líneas
escrito por Hamish Dewar, y portado al lenguaje BCPL del sistema TOPS-10
de la minicomputadora DEC PDP-10 de finales de la década de 1960 -
implementación que lo haría famoso entre varias mas.

Hoy podremos instalarlo en nuestro sistema GNU con Linux merced de una
versión instrumentada para Unix en el lenguaje C. Podremos compilarlo
fácilmente si abrimos una terminal con Ctrl+Alt+t e ingresamos el
siguiente bloque de Comandos de Organización:

cd /tmp ;
wget https://ecce.sourceforge.net/ecce.c ;
gcc -o ecce -DWANT_UTF8 ecce.c ;
sudo mv /tmp/ecce /usr/local/bin/

Una vez instalado, podremos correr Ecce dando rienda a la siguiente
sintaxis:

ecce fichero_origen fichero_destino

Como vemos, este dinosaurio salió de un huevo para rugir en sistemas
monousuario a través de terminales teletipo. Es ciertamente capaz de
operar en sistemas multiusuario, pero si lo hacemos "así nomás" se
produciría un efecto ostensiblemente destructivo, ya que uno de los
usuarios podría alterar irremediablemente el documento que otro se
encuentra operando en el mismo sistema. Es por este motivo por el cual
para usar Ecce en GNU nos vemos obligados a instrumentar de forma adhoc
un fichero de origen local (autónomo) que nos reparta los buñuelos. En
efecto, lo más sencillo es utilizar el touch para crear un fichero
origen.txt (si este no existiera ya). Por ejemplo: 

touch origen.txt ;
ecce origen.txt destino.txt

Una vez inicializado un fichero propio, Ecce podrá arrancar
presentandonos la memoria disponible en su almacén (“búfer”), y
aguardando órdenes:

Espacio de almacén = 768 KBytes
Ecce
>

Como todo editor de los llamados modales, durante su operación Ecce nos
presentará alguno de sus prompts indicativos del modo de operación en
que se encuentra de momento. Estos son:

    Prompt del Modo de Comando: >
    Prompt del Modo de Inserción de texto: :

Para su empleo más sencillo y básico de entre sus numerosos comandos es
suficiente dominar sólo tres:

Comando 	Acción
g 	Almacenar una sola línea nueva
m 	Avanza el puntero una sola línea
p 	Imprime la línea donde se encuentra el puntero

De esta manera, sesión típica implica recibir el prompt de comandos >
donde introducimos la orden g* (“almacenar líneas indefinidiamente”), y
presionar la tecla Intro para empezar a escribir. Su prompt cambiará al
de inserción texto en forma de :. y podremos mecanografiar el párrafo
deseado. Al concluirlo debemos presiona la tecla Intro para almacenar
dicha línea en memoria.

Conforme hayamos finalizado la inserción de la(s) línea(s) de texto
deseadas podremos detener el modo de inserción ingresando el comando :
que nos devolverá al prompt de comandos >.

Estos cambios realizados al fichero de origen podremos guardarlos en el
fichero destino desde el prompt de comandos > (y cerrar el editor), si
introducimos el comando %c.

Naturalmente, podremos continuar agregando líneas indefinidamente hasta
agotar el almacén, o introducir alguno de estos comandos especiales de
Ecce:

%a 	Descarta la edición realizada.
%c 	Guarda los cambios y cierra.
%v 	Imprime la versión de Ecce.	

Pues bien señores, si bien este funcionamiento parecería similar al de
una antigua máquina de escribir, contaremos con grandes ventajas con
respecto a estas. Para movernos en el texto, podremos desplazar la
posición actual de edición en el documento (llamada “puntero”). Al
llegar al fin del documento recibiremos como indicación el mensaje ***
FIN ***.Los comandos de desplazamiento son sencillos:

m 	Baja el puntero una línea
m- 	Sube el puntero una línea
k 	Borra la línea actual del puntero
k- 	Borra la línea anterior del puntero
r 	Se mueve a la derecha un carácter en la línea actual
l 	Se mueve a la izquierda un carácter en la línea actual
e 	Borra un carácter en la línea actual

Junto a estos comandos básicos de una sola letra, Ecce dispone
ciertamente de la posibilidad de realizar tareas más complejas y
avanzadas que permiten un mayor control. Estas funciones avanzadas
inspirarían luego al editor de cadenas sed.

En primer lugar y como regla general, si introducimos un número n junto
a nuestro comando, se lo ejecutará en bucle una n cantidad de 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 esta manera es posible extender o bien invertir el orden del comando
antecediendo al número n con un signo -. Por ejemplo:

p*	Imprime todo 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 puntero todas las líneas (vuelve al inicio del texto)

Una de las funcionalidades más utilizadas es la de buscar y reemplazar.

i/texto/ 	Inserta una cadena “texto” aquí en la línea.
f/texto/ 	Busca “texto” indicado.

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

Además, las órdenes pueden encadenarse. Por ejemplo:

m23 f/texto/ p3

Los comandos avanzados de Ecce permiten incluso mayor potencia de
trabajo:

A 	Ajusta el largo
B 	Divide la línea en dos en el puntero
C 	Cambia mayúsculas con Mayúsculas derecha
C- 	Cambia a minúsculas con Mayúsculas izquierda
D/texto 	Borra primer ocasión de texto
D-/texto 	Borra iteración previa de texto
E 	Borra carácter a la derecha del puntero
E- 	Borra carácter a la izquierda del puntero
G/texto 	Inserta línea de texto luego del puntero
G- 	Sube una línea
I/texto 	Inserta texto a la derecha del puntero
I- 	Inserta texto a la izquierda del puntero
J 	Une la siguiente línea
O/texto 	Sobreescribe la línea con la cadena texto

Los comandos compuestos de Ecce son secuencias de comandos cerrados
entre paréntesis. Pueden repetirse en bucle, tanto condicional como
incondicional. Los ejemplos suelen aclararlo todo, como decía Napoleón:

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 que tienen 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 introducimos un número en la línea de comandos, Ecce repetirá el
comando indicado anteriormente una n cantidad de veces.

Podremos delimitar patrones por cualquier carácter excepto letras,
dígitos, y aquellos que tienen significación definida. Podremos usar: “,
/, $, >, +, ., :, = y _

Asimismo, podremos ver el antiguo manual de Ecce.


EdLin

A la vez que Ecce contaba con plétora de adeptos universitarios, su
decante a las terminales teletipo en boga durante su desarrollo lo hizo
verse progresivamente superado con la aparición de las la edición visual
de textos en pantalla. Sin embargo los editores modales aún contaban con
cierta valía si se hablaba de equipamiento de escasa potencia, y esto
era válido con la IBM PC de primera factura y su sistema operativo, el
DOS. En sus inicios se decidió adornarlo con un editor orientado a
líneas descaradamente influido por el editor Ed del Unix: EdLin.

A pesar de que podría parecer de escasa valía, este ha sido implementado
de manera libre por el Proyecto FreeDOS, y a caballo regalado no se le
mira el diente. Por tanto podremos instalarnos una copia para nuestro
sistema GNU, acudiendo a la terminal:

wget https://sourceforge.net/projects/freedos-edlin/files/freedos-edlin/2.22/edlin-2.22.tar.gz ;
tar xvzf edlin-2.22.tar.gz ;
cd cd edlin-2.22/ ;
./configure;
make;
sudo make install

Una vez instalado en nuestro GNU, la ejecución del programa es sumamente
sencilla:

edlin

Edlin nos presentará su pantalla inicial y nos hará la veña aguardando
órdenes. Como tal sigue premisas algo similares a otros editores
nodales:

    Prompt de su Modo de Comandos: *
    Prompt de su Modo de Inserción: :

Por convención EdLin opera con bloques de sólo 11 líneas. Para facilitar
la explicación, convendremos entre nosotros las siguientes convenciones
para operar en su modo de comandos:

    Los corchetes [] denotarán parámetros opcionales.

    La n nos representará un número de línea, que puede ser uno de
    varios valores posibles:

Una cadena de dígitos, o sea un número de línea literal 	Por ejemplo, 12 es la decimosegunda línea.
n 	Representa al número de línea justo antes de la última línea del fichero.
. (“punto”) 	Representa la línea actual en el fichero.
$ (“peso”) 	Representa la línea final del fichero.
+n o -n 	Es un diferencial de suma o resta del número de línea actual. Es útil para dar posiciones relativas a una línea, tal como .+1 para significar “la línea posterior a la actual”.

    El símbolo $ representa una cadena de caracteres. Podrás encerrar la
    cadena tanto en apóstrofes 'texto' o bien en comillas "texto", o
    podrán contener las siguientes secuencias de escape:

\a 	Carácter de campana
\b 	Carácter de Retroceder (borrado)
\e 	Escape
\f 	Alimenta papel
\t 	Tabulador horizontal
\v 	Tabulador vertical
\" 	Comillas
\' 	Apóstrofe
\. 	Punto
\\ 	Barra invertida
\xXX 	Valor Hexadecimal, donde cada X es un dígito hexadecimal (de 0 a F, tanto en mayúsculas como minúsculas)
\dNNN 	Valor decimal, donde cada N es un dígito decimal (de 0 a 9)
\OOO 	Valor octal, donde cada O es un dígito cotal (de 0 a 7)
\^C 	Caracter de Control, tal como \^J para un caracter “Control+J” literal (linefeed).

Pues bien señores, al igual que Ecce, el funcionamiento básico de EdLin
consiste en activar el comando de agregado al almacén, e insertar
contenido en el mismo. Para ello, en el prompt * ingresamos el comando a
y mecanografiamos las líneas. Para almacenarlas, presionamos la tecla
Intro. Para cesar el modo del inserción, en este caso debemos ingresar
un . aislado.

Para guardar usaríamos w fichero seguido del comando salir, que es q. (O
bien podremos usar e fichero, que equivale a "guardar y salir"). Para
salir de EdLin si guardar se usa q, a lo que se nos interrogará “Abort
edit (Y/N)?”. Deberíamos responder yes.

Las funciones de edición de EdLin implican generalmente pocas variantes.
La primera es indicar un número de línea para establecer el puntero, y
escribirla de nuevo para reemplazar la línea.

Si en cambio quisiéramos insertar una línea previamente a otra,
usaríamos [n]i para ingresar al en el modo inserción, la cual también
acepta las secuencias de escape indicadas. Para abandonar el modo de
inserción, ingresamos . en una línea aislada (si necesitáramos escribir
una línea que sólo contenga un punto literalemnte, deberías indicarlo
escapándolo como \.). Tras de abandonar el modo de inserción, la línea
posterior al texto insertado se convertirá en la línea actual (a no ser
que la inserción se hubiese suspendido al final del almacén, en cuyo
caso la última línea del almacén se convertirá en la posición del
puntero).

Para borrar una línea debemos utilizar el comando d, el cual también
acepta rangos en la forma de [n][,n]d que borrarían un bloque de líneas
consecutivas del almacén. Los parámetros responden a la primer línea y
la última línea del bloque a borrar.

Si tuviésemos la necesidad de copiar un rango de líneas, utilizaremos el
comando [n],[n],n,[n]c para copiar un rango de líneas consecutivo a otra
localización del búfer. En este orden, los parámetros son los
siguientes:

    La primer línea que quiere copiar (si se omite se usará el puntero) 
    La última línea que quiere copiar (si se omite se usará el puntero) 
    La línea anterior en la cual desea insertar el bloque de líneas 
    La cantidad de veces que copiará el bloque demarcado (si se omite es 1)

(Luego de copiar las líneas, es conveniente usar el comando l (“listar”)
para tener una idea de cómo quedaron los números de línea tras la
operación).

Para mover un bloque de texto (más conocido como "copiar y pegar"),
debemos usar el comando m, y procedemos igual que con el comando copiar
anteriormente descripto. En este caso funcionará igual que copiar, sólo
que borrará el bloque de su posición original

Si deseamos presentar todas las líneas usamos p, y para presentar un
rango de líneas en pantalla, utilizamos [n][,n]p. Es similar al comando
l (list) con la excepción que los parámetros por defecto comienzan en el
puntero en lugar de hacerlo 11 líneas posteriores.

Para buscar una cadena texto usamos [n][,n][?]s$ lo que realizará esta
operación. Si omite el primer parámetro, comenzará a buscar desde la
línea actual. Si omite el segundo parámetro, dejará de buscar al llegar
al final del búfer. Si incluye el ?, edlin solicitará confirmación ante
cada encuentro. Si respondemos “no”, continuará la búsqueda y si
respondemos “yes” la dará por concluida.

Si la búsqueda localiza la subcadena, desplazará el puntero.

En caso de operar con búsqueda y reemplazo debemos utilizar
[n][,n][?]r$,$ para reemplazar todas las iteraciones de la primer cadena
con la segunda cadena entre las dos líneas especificadas. Si omitimos el
primer parámetro, EdLin comenzará reemplazando a partir del puntero. Si
en cambio omitimos el segundo parámetro, dejará de reemplazar texto en
la última línea del búfer.

Si incluye un ?, edlin mostrará un mensaje de confirmación antes de
reemplazar las iteraciones de texto.

Para insertar un fichero usamos[n]t fichero. Esto Insertará el contenido
del fichero antes del puntero. Si omitimos el primer número de línea, se
insertará antes de la línea actual del puntero.

Como vemos, los editores modales son simplones, pero permiten ciertas
posibilidades efectivas de edición, y constituyen un herramental válido
para comprender cómo se realizaba cómputo antes de que el Justicialismo
garantizara los derechos de un editor de texto como la gente hasta al
más humilde de mis grasitas.