Skip to main content

Lors de la mise en œuvre d'une modification du noyau OpenVOS, je me suis trouvé confronté à la tâche de modifier environ 150 fichiers. Cela signifiait les réserver dans le système de contrôle des sources, mettre à jour le copyright, ajouter une ligne d'historique des modifications, et effectuer le changement de code (qui consistait à ajouter une déclaration #include pré-processeur. Je savais que si je commençais simplement à faire ce travail à la main, cela prendrait une éternité. J'ai donc utilisé quelques raccourcis pour faire le travail plus rapidement.

La première astuce que j'ai utilisée a été de créer une liste de tous les fichiers que je devais modifier. J'ai utilisé notre système de contrôle des sources pour générer cette liste, mais elle n'était pas sous une forme que je pouvais facilement utiliser. J'ai donc capturé la sortie de la commande et j'ai utilisé une macro du clavier emacs pour la transformer en une macro de commande. Si vous n'avez jamais utilisé une macro de clavier emacs auparavant, vous allez vous régaler. Si vous les avez utilisées, vous pouvez sauter cette partie et passer à l'astuce suivante.

L'éditeur emacs dispose d'une commande qui peut enregistrer les demandes d'édition au fur et à mesure qu'elles sont saisies. Dans OpenVOS emacs et GNU emacs, la commande permettant de lancer l'enregistrement des commandes est "ESC-(". Chaque commande que vous tapez ensuite est exécutée et enregistrée. Lorsque vous êtes prêt à arrêter l'enregistrement, vous tapez "ESC-)". Vous pouvez exécuter la macro clavier une seule fois en tapant "ESC-m" (dans OpenVOS emacs) ou "^X-e" (dans GNU emacs). Les macros de clavier sont parfaites pour éditer des fichiers très répétitifs, ce qui est exactement le cas auquel j'ai été confronté. Voici un exemple simplifié, en utilisant une liste des fonctions POSIX qui commencent par la lettre "a" :

liste

Fichiers : 17, Blocs : 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 alarm.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

J'ai dû modifier ce tampon pour que chaque ligne ressemble à ceci :

fixup abort.c

où fixup.cm était une macro de commande qui permettait d'accomplir plusieurs tâches (nous y reviendrons plus tard). J'ai donc supprimé les premières lignes de sorte que tout ce qui restait dans le tampon emacs était la liste répétitive des fichiers. Avec mon curseur sur le début de la première ligne, j'ai tapé "ESC-(" pour commencer l'enregistrement, puis j'ai procédé à la modification de la ligne pour supprimer les deux premiers "mots" et les remplacer par la chaîne "fixup". J'ai ensuite laissé le curseur au début de la ligne suivante, et j'ai terminé l'enregistrement avec "ESC-)". Voici la séquence exacte que j'ai tapée (en utilisant les raccourcis clavier d'OpenVOS emacs) :

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

Maintenant, la première ligne a été éditée et mon curseur est au début de la deuxième ligne. Comme tout a bien fonctionné, j'ai ensuite tapé :

ESC-99 ESC-m

pour modifier le reste du fichier. Comme la mémoire tampon compte moins de 99 lignes, cette macro s'exécute jusqu'à la fin de la mémoire tampon, puis s'arrête. Ensuite, j'ai écrit le tampon sous la forme "fixup_all.cm".

L'étape suivante a consisté à écrire la macro de commande "fixup.cm". J'ai décidé qu'elle mettrait à jour le copyright, l'historique des modifications, puis qu'elle entrerait dans emacs pour que je puisse ajouter manuellement l'instruction #include. Alors que j'étais encore dans emacs, j'ai créé une nouvelle macro de clavier pour insérer la déclaration #include nécessaire au niveau du curseur :

ESC-( #inclure "échantillon.h" ESC-)

Comme je devais entrer et sortir d'emacs pour chaque fichier, j'ai dû enregistrer cette macro de façon permanente et la lier à une clé. La requête emacs pour enregistrer la macro clavier actuelle en tant que macro permanente est "save_macro" mais elle n'a pas de liaison à une touche par défaut. Pour l'exécuter une fois, tapez

ESC-r save_macro

et il vous demandera d'associer le nom à cette nouvelle macro. J'ai appelé ma macro "add_include_file". J'ai ensuite édité mon fichier start_up.emacs pour qu'il contienne la ligne :

set_key ^z-i add_include_file

J'ai donc quitté emacs et je l'ai redémarré, afin d'être sûr que la déclaration set_key fonctionnerait correctement. J'ai ensuite saisi le texte de fixup.cm. J'ai utilisé l'éditeur de ligne parce que je pensais que c'était le moyen le plus simple de mettre à jour l'historique des modifications.

&begin_parameters

nom du fichier, req

&end_parameters

!add_copyright &file&

&attach_input

!line_edit &file& -no_backup -no_verbose

l/End of modification history/

-1

i

/* Modifié le 10-05-17 par Paul Green en ... */

.

écrire à

quitter

&detach_input

emacs &file&

&retour

Cette macro va ajouter (ou mettre à jour) les informations de copyright, ajouter la ligne d'historique des modifications juste avant le commentaire que nous utilisons pour marquer la fin de la section d'historique des modifications, et ensuite entrer emacs pour que je puisse trouver manuellement l'endroit où ajouter la déclaration %include.

J'ai maintenant deux macros de commande : "fixup_all.cm" et "fixup.cm". La première invoque la seconde une fois pour chaque fichier qui doit être modifié. J'ai ensuite commencé ma session d'édition marathon en tapant "fixup_all" et tout ce que j'avais à faire était de trouver l'endroit où insérer l'instruction #include, taper "^Z-i", écrire le fichier et quitter. Les macros ont fait le reste du travail.

Même avec le temps qu'il a fallu pour écrire les macros, j'ai quand même économisé beaucoup de temps et d'efforts (et probablement quelques fautes de frappe) en créant ces macros d'éditeur et de commande. Cela a également transformé une tâche ennuyeuse en une tâche beaucoup plus intéressante.

J'espère que vous trouverez ces informations utiles. C'est tout pour le moment.

2024 Stratus Technologies.