OpenVOSカーネルへの変更を実装する際、約150個のファイルを変更しなければならない状況に直面しました。つまり、ソース管理システムでこれらのファイルをロックし、著作権情報を更新し、変更履歴の行を追加し、コードの変更(#includeというプリプロセッサ命令を追加する作業)を行う必要がありました。この作業を手作業で始めれば、永遠に終わらないことはわかっていました。 そこで、作業を早く終わらせるために、いくつかの近道を使いました。
最初に試みたのは、編集が必要なすべてのファイルのリストを作成することでした。ソース管理システムを使ってそのリストを生成しましたが、そのままでは使い勝手が良くなかったのです。 そこで、コマンドの出力をキャプチャし、Emacsのキーボードマクロを使ってコマンドマクロに加工しました。Emacsのキーボードマクロを使ったことがない方は、きっと気に入るはずです。すでに使ったことがある方は、この部分は飛ばして次のテクニックに進んでください。
Emacsエディタには、入力された編集操作を記録できるコマンドがあります。OpenVOS EmacsとGNU Emacsのどちらでも、コマンドの記録を開始するコマンドは「ESC-(」です。その後に入力したすべてのコマンドが実行され、記録されます。記録を停止する準備ができたら、「ESC-)」と入力します。 キーボードマクロは、「ESC-m」(OpenVOS Emacsの場合)または「^X-e」(GNU Emacsの場合)と入力することで、1回だけ実行できます。キーボードマクロは、非常に反復的なファイルの編集に最適であり、まさに私が直面していた状況にぴったりでした。以下に、文字「a」で始まるPOSIX関数のリストを使用した、簡略化した例を示します。
一覧
ファイル数:17、ブロック数: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
このバッファを編集して、各行を次のような形にする必要がありました:
abort.c の修正
ここで、fixup.cm はいくつかのタスクを実行するコマンドマクロでした(これについては後で詳しく説明します)。そこで、Emacsのバッファに残っているのが繰り返しのファイルリストだけになるよう、最初の数行を削除しました。 カーソルを最初の行の先頭に置き、「ESC-(」と入力して記録を開始し、その行を編集して最初の2つの「単語」を削除し、文字列「fixup」に置き換えました。その後、カーソルを次の行の先頭に移動させ、「ESC-)」と入力して記録を終了しました。 以下に、私が入力した正確な操作手順を示します(OpenVOS版Emacsのキーバインドを使用)。
ESC-( ESC-d ESC-d 修正 ^N ^A ESC-)
これで1行目が編集され、カーソルが2行目の先頭に移動しました。すべて問題なく動作したので、次に次のように入力しました:
ESC-99 ESC-m
ファイルの残りの部分を編集するためです。バッファの行数が99行未満であるため、このマクロはバッファの末尾に達するまで実行され、その後停止します。その後、バッファの内容を「fixup_all.cm」というファイル名で保存しました。
次のステップは、「fixup.cm」というコマンドマクロを作成することでした。このマクロでは、著作権情報を更新し、変更履歴を更新した後、Emacsを起動して手動で#include文を追加できるようにすることに決めました。Emacsを起動したまま、カーソル位置に必要な#include文を挿入するための新しいキーボードマクロを作成しました:
ESC-( #include “sample.h” ESC-)
ファイルごとにEmacsを起動・終了することになるため、このマクロを永続的に保存し、キーに割り当てる必要がありました。現在のキーボードマクロを永続的なマクロとして保存するためのEmacsのコマンドは「save_macro」ですが、デフォルトのキーバインドは設定されていません。一度だけ実行するには、次のように入力します
ESC-r save_macro
すると、この新しいマクロに付ける名前を入力するよう求められます。私はこのマクロを「add_include_file」と名付けました。その後、start_up.emacs ファイルを編集して、次の行を追加しました:
set_key ^z-i add_include_file
そこで、`set_key`文が正しく動作することを確認するために、Emacsを終了して再起動しました。その後、fixup.cmのテキストを入力しました。変更履歴を更新するには、行エディタを使うのが最も簡単だと思ったので、それを使用しました。
&begin_parameters
ファイルパス名、req
&end_parameters
!add_copyright &file&
&attach_input
!line_edit &file& -no_backup –no_verbose
l/変更履歴の終わり/
-1
i
/* 2017年10月5日、Paul Green により … に変更 */
.
書く
終了
&detach_input
emacs &file&
&return
このマクロは、著作権情報を追加(または更新)し、変更履歴セクションの終わりを示すコメントの直前に変更履歴の行を追加した後、Emacsに戻り、%include文を追加する場所を手動で探せるようにします。
現在、私には「fixup_all.cm」と「fixup.cm」という2つのコマンドマクロがあります。 前者は、修正が必要なファイルごとに後者を1回呼び出します。そこで、「fixup_all」と入力して長時間の編集作業を開始しました。あとは、#include文を挿入する場所を見つけ、「^Z-i」と入力し、ファイルを書き出して終了するだけで済みました。残りの作業はマクロがすべて行ってくれました。
マクロの作成に時間がかかったとはいえ、これらのエディタ用およびコマンド用マクロを作成したおかげで、時間と労力を大幅に節約できました(おそらくタイプミスも減ったでしょう)。また、退屈な作業が、ずっと興味深いものになりました。
この情報がお役に立てば幸いです。以上です。
