Passa al contenuto principale

Mentre implementavo una modifica al kernel di OpenVOS, mi sono trovato di fronte al compito di modificare circa 150 file. Questo significava riservarli nel sistema di controllo dei sorgenti, aggiornare il copyright, aggiungere una linea di cronologia delle modifiche e fare il cambiamento del codice (che era quello di aggiungere una dichiarazione #include pre-processor. Sapevo che se avessi semplicemente iniziato a fare questo lavoro a mano ci sarebbe voluta un'eternità. Così ho usato un paio di scorciatoie per fare il lavoro più velocemente.

Il primo trucco che ho usato è stato quello di creare una lista di tutti i file che dovevo modificare. Ho usato il nostro sistema di controllo dei sorgenti per generare quella lista, ma non era in una forma che potessi usare facilmente. Così ho catturato l'output del comando e ho usato una macro da tastiera emacs per massaggiarlo in una macro di comando. Se non avete mai usato una macro di tastiera emacs prima d'ora, vi aspetta una sorpresa. Se le avete usate, potete saltare questa parte e passare al trucco successivo.

L'editor emacs ha un comando che può registrare le richieste di modifica man mano che vengono inserite. Sia in OpenVOS emacs che in GNU emacs, il comando per avviare la registrazione dei comandi è "ESC-(". Ogni comando che si digita dopo viene eseguito e registrato. Quando si è pronti a fermare la registrazione, si digita "ESC-)". Potete eseguire la macro da tastiera una sola volta digitando "ESC-m" (in OpenVOS emacs) o "^X-e" (in GNU emacs). Le macro da tastiera sono ottime per l'editing di file altamente ripetitivi, che è esattamente il caso che ho affrontato. Ecco un esempio semplificato, utilizzando una lista delle funzioni POSIX che iniziano con la lettera "a":

elenco

I file: 17, Blocchi: 19

r 2 abort.c

r 1 accesso.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 allarme.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

Avevo bisogno di modificare questo buffer in modo che ogni linea assomigliasse a questa:

fixup abort.c

dove fixup.cm era una macro di comando che avrebbe svolto diversi compiti (di questo parleremo più avanti). Così ho cancellato le prime righe in modo che tutto ciò che rimaneva nel buffer emacs fosse la lista ripetitiva dei file. Con il mio cursore all'inizio della prima riga, ho digitato "ESC-(" per iniziare la registrazione, e poi ho proceduto a modificare la riga per cancellare le prime due "parole" e sostituirle con la stringa "fixup". Ho poi lasciato il cursore all'inizio della riga successiva e ho terminato la registrazione con "ESC-)". Ecco l'esatta sequenza che ho digitato (usando le rilegature dei tasti emacs di OpenVOS):

ESC-( ESC-d ESC-d fixup ^N ^A ESC-)

Ora la prima riga è stata modificata e il mio cursore si trova all'inizio della seconda riga. Visto che tutto funzionava bene, ho digitato:

ESC-99 ESC-m

per modificare il resto del file. Poiché il buffer ha meno di 99 linee, questa macro viene eseguita fino a quando non raggiunge la fine del buffer, e poi si ferma. Poi ho scritto il buffer come "fixup_all.cm".

Il passo successivo è stato quello di scrivere la macro di comando "fixup.cm". Ho deciso che avrebbe aggiornato il copyright, aggiornato la cronologia delle modifiche e poi inserito emacs in modo da poter aggiungere manualmente la dichiarazione #include. Mentre ero ancora in emacs, ho creato una nuova macro da tastiera per inserire il necessario #include statement al cursore:

ESC-( #include "sample.h" ESC-)

Dal momento che entravo e uscivo da emacs per ogni file, dovevo salvare questa macro in modo permanente e legarla ad una chiave. La richiesta emacs di salvare la macro corrente della tastiera come macro permanente è "save_macro", ma non ha un binding predefinito su un tasto. Per eseguirla una volta, digitare

ESC-r save_macro

e vi chiederà il nome da associare a questa nuova macro. Ho chiamato la mia macro "add_include_file". Ho quindi modificato il mio file start_up.emacs per contenere la riga:

set_key ^z-i add_include_file

Così ora ho abbandonato l'emacs e l'ho riavviato, in modo da essere sicuro che la dichiarazione set_key funzionasse correttamente. Ho poi inserito il testo di fixup.cm. Ho usato l'editor di linea perché pensavo fosse il modo più semplice per aggiornare la cronologia delle modifiche.

&parametri_inizio_parametri

percorso file,req

eparametri_fine_parametri

add_copyright&file&file

&attach_input

...line_edit &file& -no_backup -no_verbose

l/Fine della storia delle modifiche/

-1

i

/* Modificato il 10-05-17 da Paul Green a ... */

.

scrivi

chiudere

&detach_input

emacs &file&

&ritorno

Questa macro aggiungerà (o aggiornerà) le informazioni sul copyright, aggiungerà la riga della cronologia delle modifiche appena prima del commento che usiamo per segnare la fine della sezione della cronologia delle modifiche, e poi inserirà emacs in modo da poter trovare manualmente il posto per aggiungere la dichiarazione %include.

Ora ho due macro di comando: "fixup_all.cm" e "fixup.cm". La prima invoca la seconda una volta per ogni file che deve essere modificato. Ho quindi iniziato la mia maratona di editing digitando "fixup_all" e tutto quello che dovevo fare era trovare il posto per inserire l'istruzione #include, digitare "^Z-i", scrivere il file e uscire. Le macro hanno fatto il resto del lavoro.

Anche con il tempo necessario per scrivere le macro, ho comunque risparmiato molto tempo e fatica (e probabilmente qualche errore di battitura) creando queste macro di editor e comando. Ha anche trasformato un compito noioso in un compito molto più interessante.

Spero che troviate utili queste informazioni. Questo è tutto per ora.

© 2024 Stratus Technologies.