Mientras implementaba un cambio en el núcleo OpenVOS, me encontré con la tarea de modificar unos 150 archivos. Esto significaba reservarlos en el sistema de control de código fuente, actualizar los derechos de autor, añadir una línea con el historial de modificaciones y realizar el cambio en el código (que consistía en añadir una instrucción del preprocesador #include). Sabía que si simplemente empezaba a hacer este trabajo a mano, me llevaría una eternidad. Así que utilicé un par de atajos para hacer el trabajo más rápido.
El primer truco que utilicé fue crear una lista de todos los archivos que necesitaba editar. Utilicé nuestro sistema de control de código fuente para generar esa lista, pero no estaba en un formato que pudiera usar fácilmente. Así que capturé el resultado del comando y utilicé una macro de teclado emacs para convertirlo en una macro de comando. Si nunca has utilizado una macro de teclado emacs, te va a encantar. Si ya las has utilizado, puedes saltarte esta parte y pasar al siguiente truco.
El editor emacs tiene un comando que puede registrar las solicitudes de edición a medida que se introducen. Tanto en OpenVOS emacs como en GNU emacs, el comando para iniciar la grabación de comandos es «ESC-(». Cada comando que se escribe después de eso se ejecuta y se graba. Cuando se desea detener la grabación, se escribe «ESC-)». Puede ejecutar la macro de teclado una sola vez escribiendo «ESC-m» (en OpenVOS emacs) o «^X-e» (en GNU emacs). Las macros de teclado son ideales para editar archivos muy repetitivos, que era precisamente mi caso. A continuación se muestra un ejemplo simplificado, utilizando una lista de las funciones POSIX que comienzan con la letra «a»:
lista
Archivos: 17, Bloques: 19
r 2 abort.c
r 1 access.c
r 1 adjtime.c
r 1 aio_cancel.c
r 1 aio_error.c
r 1 aio_fsync.c
r 1 aio_read.c
r 1 aio_return.c
r 1 aio_suspend.c
r 1 aio_write.c
r 2 alarma.c
r 1 altzone.c
r 1 asctime.c
r 1 asctime_r.c
r 1 asprintf.c
r 1 assert.c
r 1 atexit.c
Necesitaba editar este búfer para que cada línea tuviera este aspecto:
Corregir abort.c
donde fixup.cm era una macro de comando que realizaba varias tareas (más adelante se ofrece más información al respecto). Así que borré las primeras líneas para que lo único que quedara en el búfer de Emacs fuera la lista repetitiva de archivos. Con el cursor en el inicio de la primera línea, escribí «ESC-(» para iniciar la grabación y, a continuación, procedí a editar la línea para eliminar las dos primeras «palabras» y sustituirlas por la cadena «fixup». A continuación, dejé el cursor al inicio de la siguiente línea y finalicé la grabación con «ESC-)». Esta es la secuencia exacta que escribí (utilizando las combinaciones de teclas de OpenVOS emacs):
ESC-( ESC-d ESC-d corrección ^N ^A ESC-)
Ahora se ha editado la primera línea y el cursor se encuentra al principio de la segunda línea. Como todo ha funcionado correctamente, he escrito:
ESC-99 ESC-m
para editar el resto del archivo. Dado que el búfer tiene menos de 99 líneas, esta macro se ejecuta hasta llegar al final del búfer y luego se detiene. A continuación, escribí el búfer como «fixup_all.cm».
El siguiente paso fue escribir la macro de comando «fixup.cm». Decidí que actualizaría los derechos de autor, actualizaría el historial de modificaciones y luego entraría en emacs para poder añadir manualmente la instrucción #include. Mientras aún estaba en emacs, creé una nueva macro de teclado para insertar la instrucción #include necesaria en el cursor:
ESC-( #include «sample.h» ESC-)
Como iba a entrar y salir de emacs para cada archivo, tuve que guardar esta macro de forma permanente y asignarla a una tecla. La solicitud de emacs para guardar la macro de teclado actual como una macro permanente es «save_macro», pero no tiene ninguna tecla asignada por defecto. Para ejecutarla una vez, escribe
ESC-r guardar_macro
y te pedirá que le des un nombre a esta nueva macro. Yo llamé a la mía «add_include_file». Después edité mi archivo start_up.emacs para que incluyera la línea:
set_key ^z-i add_include_file
Así que salí de Emacs y lo reinicié, para asegurarme de que la instrucción set_key funcionara correctamente. A continuación, introduje el texto de fixup.cm. Utilicé el editor de líneas porque me pareció la forma más fácil de actualizar el historial de modificaciones.
&begin_parameters
ruta del archivo,req
&end_parameters
!añadir_copyright &archivo&
&adjuntar_entrada
!line_edit &file& -no_backup –no_verbose
l/Fin del historial de modificaciones/
-1
i
/* Modificado el 10-05-17 por Paul Green para... */
.
escribir
renunciar
&separar_entrada
emacs &archivo&
&retorno
Esta macro añadirá (o actualizará) la información sobre derechos de autor, añadirá la línea del historial de modificaciones justo antes del comentario que utilizamos para marcar el final de la sección del historial de modificaciones y, a continuación, entrará en emacs para que pueda buscar manualmente el lugar donde añadir la instrucción %include.
Ahora tengo dos macros de comando: «fixup_all.cm» y «fixup.cm». La primera invoca a la segunda una vez por cada archivo que hay que modificar. Entonces comencé mi maratón de edición escribiendo «fixup_all» y lo único que tuve que hacer fue encontrar el lugar donde insertar la instrucción #include, escribir «^Z-i», guardar el archivo y salir. Las macros hicieron el resto del trabajo.
A pesar del tiempo que me llevó escribir las macros, ahorré mucho tiempo y esfuerzo (y probablemente algunos errores tipográficos) al crear estas macros de editor y comando. Además, convirtió una tarea aburrida en una mucho más interesante.
Espero que esta información te resulte útil. Eso es todo por ahora.
