Al implementar un cambio en el kernel de OpenVOS, me encontré con la tarea de modificar unos 150 archivos. Esto significaba reservarlos en el sistema de control de fuentes, actualizar el copyright, añadir una línea de historial de modificaciones, y hacer el cambio de código (que era añadir una declaración #include pre-processor. Sabía que si simplemente empezaba a hacer este trabajo a mano, me llevaría una eternidad. Así que usé un par de atajos para hacer el trabajo más rápido.
El primer truco que usé fue crear una lista de todos los archivos que necesitaba editar. Utilicé nuestro sistema de control de fuentes para generar esa lista, pero no estaba en una forma que pudiera usar fácilmente. Así que capturé la salida del comando y usé una macro de teclado de emacs para masajearla en una macro de comando. Si nunca has usado una macro de teclado de emacs antes, te vas a dar un gusto. Si las has usado, puedes saltarte esta parte y pasar al siguiente truco.
El editor de emacs tiene un comando que puede grabar las peticiones 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 teclea después de eso es ejecutado y grabado. Cuando estés listo para dejar de grabar, teclea "ESC-)". Puedes 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 geniales para editar archivos muy repetitivos, que fue exactamente el caso que enfrenté. Aquí hay un ejemplo simplificado, usando una lista de las funciones POSIX que empiezan con la letra "a":
lista
Archivos: 17, Bloques: 19
r 2 abortar.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_retorno.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 buffer para que cada línea se viera así:
arreglar el aborto.c
donde fixup.cm era una macro de comando que realizaría varias tareas (más sobre esto más adelante). Así que borré las primeras líneas para que todo lo que quedara en el buffer de emacs fuera la lista repetitiva de archivos. Con mi cursor al principio de la primera línea, escribí "ESC-(" para empezar a grabar, y luego procedí a editar la línea para borrar las dos primeras "palabras" y reemplazarlas por la cadena "fixup". Luego dejé el cursor al principio de la siguiente línea, y terminé la grabación con "ESC-)". Aquí está la secuencia exacta que tecleé (usando los key bindings de OpenVOS emacs):
ESC-( ESC-d ESC-d fixup ^N ^A ESC-)
Ahora la primera línea ha sido editada y mi cursor está en el comienzo de la segunda línea. Como todo funcionó bien, entonces escribí:
ESC-99 ESC-m
para editar el resto del archivo. Como el búfer tiene menos de 99 líneas, esta macro se ejecuta hasta que llega al final del búfer, y luego se detiene. Entonces escribí el buffer 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 ingresaría a emacs para poder agregar manualmente la declaración #include. Mientras estaba en emacs, creé una nueva macro de teclado para insertar la declaración #include necesaria en el cursor:
ESC-( #incluye "muestra.h" ESC-)
Como yo entraba y salía de los emacs para cada archivo, tenía que guardar permanentemente esta macro y vincularla a una clave. La petición de emacs para guardar la actual macro de teclado como una macro permanente es "save_macro" pero no tiene una vinculación de teclas por defecto. Para ejecutarla una vez, escribe
ESC-r save_macro
y le pedirá el nombre para asociarlo con esta nueva macro. Llamé a mi macro "add_include_file". Luego edité mi archivo start_up.emacs para contener la línea:
set_key ^z-i add_include_file
Así que ahora dejé el emacs y lo reinicié, para asegurarme de que la sentencia set_key funcionara correctamente. Entonces introduje el texto de fixup.cm. Usé el editor de líneas porque pensé que era la forma más fácil de actualizar el historial de modificaciones.
&begin_parameters
ruta de archivo, req.
&end_parameters
!add_copyright &file&
&attach_input
!line_edit & file& -no_backup -no_verbose
l/ Final de la historia de la modificación/
-1
i
/* Modificado 10-05-17 por Paul Green a ... */
.
escribe
Deje
&desprender_inputar
emacs & archivo&
y regreso
Este macro añadirá (o actualizará) la información de copyright, añadirá la línea del historial de modificaciones justo antes del comentario que usamos para marcar el final de la sección del historial de modificaciones, y luego introducirá emacs para que pueda encontrar manualmente el lugar para añadir la declaración %include.
Ahora tengo dos macros de comando: "fixup_all.cm" y "fixup.cm". El primero invoca al segundo una vez por cada archivo que hay que modificar. Entonces empecé mi maratón de edición escribiendo "fixup_all" y todo lo que tenía que hacer era encontrar el lugar para insertar la sentencia #include, escribir "^Z-i", escribir el archivo y salir. Las macros hicieron el resto del trabajo.
Incluso con el tiempo que me llevó escribir las macros, me ahorré mucho tiempo y esfuerzo (y probablemente algunos errores de escritura) creando estas macros de edición y comando. También convirtió una tarea aburrida en una tarea mucho más interesante.
Espero que esta información le sea útil. Eso es todo por ahora.