Volver menú revistas Volver página anterior

El Amiga Me Encanta ha conseguido el permiso por escrito de IDG Comunications España para ofrecer los artículos de la revista Amiga World España.

N° 30 - Marzo 1992
MACROS ARexx

Por Mark Thomas

Una manifestación del incremento en el soporte ARexx son las aplicaciones Amiga, ya que cada vez son más y más los programas que incluyen una opción de macro ARexx. Estas tienen su mayor utilidad sabiendo como sacar el máximo provecho de estas en los procesos repetitivos, tareas que consumen tiempo, así como en la ayuda para personalizar la aplicación según sean sus necesidades.

Uno de los procesadores de texto más representativos del mundo, ProWrite, cuenta con una macro ARexx en la nueva versión 3.0. Podrá utilizar las macros ARexx con ProWrite de dos formas. La primera, y más simple, forma no es interactiva; donde la macro consiste en una serie de combinaciones de teclas o movimientos del ratón que se reproducirán en una secuencia determinada. La información fluye en un único sentido: desde ARexx hacia el programa. Un ejemplo de esta es una macro que imprime su nombre y dirección como cabecera en un documento de ProWrite.

Sin embargo las macros ARexx también pueden operar de forma interactiva entre ARexx y ProWrite. La información devuelta por el programa a ARexx puede afectar el resultado de la macro. En esta ocasión, la información fluye en ambos sentidos. Como una macro que pueda contar el número de lineas en un documento y a continuación confiar en ProWrite para saber donde se encuentra el final de dicho documento.

Ambos tipos de macros son sencillas de escribir dependiendo sólo de unos cuantos conceptos básicos. A continuación veremos el método más simple, macros no interactivas, evolucionando a las interactivas en la segunda parte del artículo.


Vías de único sentido

Usted puede escribir la macro no interactiva, a la cual se hizo referencia anteriormente, para definir una cabecera de documento como sigue:

/* Macro de dirección */
Type 'john Doe'
NewParagraph
Type '123 Pliasant Rd.'
NewParagraph
Type 'Hills, TX 78965'
NewParagraph

En este ejemplo, la instrucción 'Type' informa a ProWrite para que añada el texto entrecomillado al documento, mientras que el comando 'NewParagraph' informa al programa para que se añada un nuevo párrafo, como si se hubiese pulsado la tecla 'Return'. Otro macro simple en ARexx le proporcionará el número de líneas de su documento. Usted define una tabulación decimal en el documento y a continuación el macro insertará, de forma automática, el número de líneas representado por un contador específico.

/* Contador de Líneas */
Linecount = 1
Do 10
ASCII 9
Type count||'.'
linecount = linecount + 1
NewParagraph
End

Mediante 'Do 10' se informa de cuántos números de línea han de crearse, mientras que 'ASCII 9' inserta un tabulador. La línea 'Type' introduce cada número en el documento, seguido con el punto decimal al final. A continuación la macro incrementa el contador de líneas y envía un comando de nuevo párrafo (NewParagraph). Aunque como macro hace un trabajo básico, este no se encuentra cerca de ser un numerador de líneas eficaz, al no ser interactivo (lo cual se verá posteriormente).

Para definir los caminos en los Requesters 'Open' y 'Save', a un directorio distinto del definido en el arranque de ProWrite, puede utilizar otro macro ARexx. Para definir su camino, salve un documento vacío de ProWrite llamado 'setpath' en el camino deseado. A continuación escriba y salve la siguiente macro como 'ProWrite Startup' en el mismo cajón que se encuentre ProWrite. Inserte el nombre del camino deseado donde '*path*' será como sigue.

/* Define camino */
Open "*path*setpath"
Close
New

Si el camino deseado es "Work:Documentos/", entonces la línea Open anterior deberá ser como sigue: Open "Work:Documentos/setpath".


Macros Interactivas

Pese a que las macros no interactivas pueden ser útiles, estas se encuentran limitadas a 'Type', 'NewParagraph', y otros comandos de menú. Para incrementar su rango de opciones, necesitará escribir macros que trabajen de forma interactiva. Nuestro primer ejemplo cuenta el número de líneas en un documento, imprimiendo dicho número al final del mismo. El mçétodo que utiliza es desplazar el cursor desde la parte superior hacia abajo hasta que ProWrite envíe un código de error, el cual indicará que ProWrite no puede seguir desplazando el cursor por debajo de la última línea del documento. Para cumplir esto, ARexx debe recibir un resultado de ProWrite. El comando 'Options Results', situado en la parte superior, informa a ARexx para que se encuentre dispuesto a recibir resultados desde el programa.

/* Contador de líneas para ProWrite */
Options Results
AltDown
CursorUp
CursorLeft
AltUp
linecount = 1
CursorDown
Do While rc = 0
   linecount = linecount + 1
   CursorDown
End
Type linecount

La secuencia de comandos comprendida entre 'AltDown' y 'AltUp' desplaza el punto de inserción a la parte superior del documento. El código de error es devuelto a través de la variable rc, la cual es inicializada mediante el primer comando 'CursorDown', y el contador es insertado en el documento al principio de la última línea.

Nuestra siguiente macro extraerá todos los acontecimientos de una serie específica de caracteres. El propósito es tomar una cadena de caracteres señalada por el usuario y eliminar todos los casos en los que se encuentre dicha cadena dentro del documento editado. Se obtienen dos tipos de resultados con esta macro: la cadena a borrar y la condición de final del documento.

/* Eliminar secuencia de texto */
Options Results
Extract
deletestring = result
AltDown
CursorUp
CursorLeft
AltUp
Find deletestring
Do While rc = 0
Delete
FindNext
End

El comando 'Extract' devuelve el texto señalado por el usuario en la variable 'result'. Esta es una buena idea para asignar 'result' a otra variable en el caso de que la variable 'result' sea cambiada mediante otro comando. La macro sitúa el cursor en el comienzo del documento comenzando a buscar la cadena a través del mismo -borrando cada cadena igual a la indicada.

La siguiente macro es el contador de lineas intectactivo prometido en la sección anterior. Para hacerse una idea de su utilidad, supóngase que usted tiene una lista de elementos, o un cuerpo de texto que requiere números de línea como referencia. El cuerpo de texto y la lista de leemntos deberán tener rupturas en cada línea del parrafo, y cada línea deberá contener al menos un carácter de texto (requerimientos necesarios por las limitaciones de la actual versión de ProWrite).

Una forma de convertir un documento en un fichero con 'Returns' al final de cada línea, es salvando el mismo como texto, y eligiendo la opción 'Every Line'. Cargue de nuevo el documento y elija la opción 'Paragraph'. Es buena idea salvar el mismo con un nombre distinto, ya que este elimina el formato del documento y los cambios de fuentes. También puede seleccionar 'Select All' para seleccionar todo el texto, e insertar un tabulador decimal en el documento para que los números queden alineados a dicho tabulador. Esta macro trabajará sólo si no se encuentran líneas vacías en el documento.

/* Insertador de contador de líneas automático */
Options Results
ShiftUp
CtrlUp
AltDown
CursorUp
CursorLeft
AltUp
linecount = 1
saverc = 0
Do While saverc = 0
   ASCII 9
   Type linecount ||'.'
   ASCII 9
   linecount = linecount + 1
   CursorDown
   saverc = rc
   if saverc = 0 Then Do
      AltDown
      CursorLeft
      AltUp
   End
End

Otra opción útil que usted puede ejecutar desde una macro ARexx es crear una cabecera o pie de página, tomando para ello el nombre del documento que esté editando más el número de cada página alineando el mismo en la parte superior o inferior de la página. Para crear la macro de cabecera, escriba lo siguiente:

/* Introduce el nombre del documento como cabecera */

Options Results
DocName
dname = result
EditHeader
AlignRight
Type dname ||'-'
InsertPageNumber
EditDocument

Nuestro final, y macro más compleja (ver figura 1), es un catalogador de disco. Este toma un camino seleccionado y construye tres estructuras en su documento ProWrite. Esta macro facilita la comunicación con otros sistemas ejecutados en el Amiga - aparte de ARexx y ProWrite - mediante la lectura de los ficheros y directorios del disco indicado. La macro contiene dos procedimientos, representados en la sección principal del código. La primera rutina, LDirs, es recursiva, sin embargo puede hacer la misma no recursiva si define la variable 'recur' a cero. También puede tener los nombres de los ficheros y los directorios listados selectivamente mediante la definición de las variables 'files' y 'dirs'.

Mientras que las macros particulares, presentadas en este artículo, pueden no servir a sus necesidades específicas de forma exacta, estas le ofrecen unas bases para que pueda escribir sus propios Scripts. Las macros ARexx pueden hacer que ProWrite sea un programa extremadamente útil y versátil.

Figura 1
/* Catalogador de disco */
Options Results
/* Añade las librerías necesarias */
If ~Show('|',rexxsupport.Library') Then
   If ~AddLib('rexxsupport.Library',0,-30,0) Then
      Exit 10
Extract      /* Toma el disco o camino del nombre */
path = result
/* 0 = no incluye ficheros, 1 - incluye ficheros */
files = 1
/* 0 - no incluye directorios, 1 - incluye directorio */
dirs = 1
/* 0 - sin recursión, 1 - recursión */
recur = 1
d = 0
f = 0
lvel = 0
Type path
NewParagraph
      /* Toma los ficheros y directorios encontrados en 'path' */
Call LDirs(path)
AltDown
CursorUp
CursorLeft
AltUp
Exit 0
/*
Esta es la rutina que tomará los directorios encontrados en el
nivel actual. de esta forma se podrá llamar a cada uno de los
directorios encontrados para revisar el contenido de los
mismos. El nivel de directorio se almacena bajo la variable
'path'. Si se desea que ocurra el procedimiento de recursión,
la variable recur deberá encontrarse a 1.
*/
LDirs: Procedure Expose d f dirs files recur level tab
   Parse arg path
   level = level +1
   if files then
      f = LFiles(path) + 1
   if dirs | recur Then Do
      List = Showdir(path,dir,'#')
      Do While list ~=''
         n = Index(list,'#')
         if n = 0 Then Do
            element = list
            list =''
         End
         Else Do
            element = Left(list,n-1)
            list = Right(list,Length(list)-n)
         End
         if Right(path,1) = ':' Then fullelement = path || element
         Else
            fullelement = path || '/'|| element
         If dirs Then Do
            Do level
               ASCII 9
            End
            Type element
            NewParagraph
            d = d + 1
         End
         If recur = 1 Then Call Ldirs(Fullelement)
      End
   End
   level = level - 1
   Return
/*
Esta rutina es llamada desde LDirs y toma los ficheros del nivel
actual. Este actúa de la misma forma que LDirs.
*/
LFiles: Procedure Expose files level tab
   Parse arg path
   f = 0
   list = Showdir (path,file,'#')
   Do While list ~=''
      n = Index(list;'#')
      If n = 0 Then Do
         element = list
         list =''
      End
      Else Do
         element = Left(list,n-1)
         List = Right(path,1)= ':' Then
            fullelement = path || element
         Else
            fullelement = path || '/'|| element
         If files Then Do
            Do level
               ASCII 9
            End
            Type element
            NewParagraph
            f = f + 1
      End
End
Return f

Volver menú revistas Volver página anterior