OpenVOS カーネルへの変更を実装している間、私は約 150 個のファイルを修正する作業に直面していることに気付きました。これは、ソース管理システムにそれらを予約し、著作権を更新し、変更履歴行を追加し、コード変更を行うことを意味します(#includeプリプロセッサ文を追加することでした。 この作業を単純に手でやり始めると、永遠に時間がかかることがわかっていました。 そこで、仕事を早く終わらせるためにいくつかのショートカットを使いました。
最初に使ったトリックは、編集する必要のあるすべてのファイルのリストを作成することでした。 このリストを生成するためにソースコントロールシステムを使用しましたが、簡単に使用できる形式ではありませんでした。 そこで、コマンドの出力をキャプチャして、emacs のキーボードマクロを使って、それをコマンドマクロにマッサージしました。 emacsキーボードマクロを使ったことがない人は、ぜひ使ってみてください。 使ったことがある人は、この部分を読み飛ばして次のトリックに進んでください。
emacsエディタには、入力された編集要求を記録できるコマンドがあります。 OpenVOSのemacsでもGNUのemacsでも、コマンドの記録を開始するコマンドは"ESC-("で、それ以降に入力したコマンドはすべて実行されて記録されます。 記録を止める準備ができたら「ESC-)」と入力します。 キーボードマクロは「ESC-m」(OpenVOSのemacsでは)や「^X-e」(GNUのemacsでは)と入力することで一度に実行することができます。 キーボードマクロは、繰り返しの多いファイルを編集するのに適していますが、私が直面したケースはまさにこれでした。 ここでは、"a"で始まるPOSIX関数のリストを使って、単純化した例を示します。
羅列
ファイル数17, ブロック19
r 2 abort.c
R 1アクセス.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 アスプリントf.c
r 1 assert.c
r 1 atexit.c
このバッファを編集して、各行がこのようになるようにする必要がありました。
fixup abort.c
ここで、fixup.cm はいくつかのタスクを実行するコマンドマクロでした (これについては後で詳しく説明します)。 そこで、最初の数行を削除して、emacs バッファに残っていたのはファイルの繰り返しのリストだけでした。 最初の行の先頭にカーソルを置いた状態で、"ESC-("と入力して記録を開始し、その行を編集して最初の2つの"単語"を削除して"fixup"という文字列に置き換えました。そして、次の行の先頭にカーソルを置いたまま、"ESC-)"で録音を終了しました。 以下は、私が入力した正確なシーケンスです (OpenVOS の emacs キーバインドを使って)。
ESC-( ESC-d ESC-d修正 ^N ^A ESC-)
これで1行目が編集され、カーソルが2行目の先頭に来ました。すべてがOKだったので、私はその後入力しました。
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 保存マクロ
と入力すると、この新しいマクロに関連付ける名前を要求されます。 私はこのマクロを "add_include_file" と呼びました。 次に、start_up.emacsファイルを編集して、次の行を含むようにしました。
set_key ^z-i add_include_file
そこで、set_key文が正しく動作することを確認するために、emacsを終了して再起動しました。そして、fixup.cmのテキストを入力しました。 修正履歴を更新するのが一番簡単だと思ったので、ラインエディタを使ってみました。
&begin_parameters
ファイルパス名、req
終了パラメータ
!add_copyright &file&
アタッチ入力
!line_edit &file& -no_backup -no_verbose
l/変更履歴/終了
-1
i
/* Modified 10-05-17 by Paul Green to ... */ 10-05-17 by Paul Green to ...
.
書く
辞める
&detach_input
エマックス&ファイル&ファイル
復帰
このマクロは、著作権情報を追加(または更新)して、修正履歴部分の終わりをマークするのに使うコメントの直前に修正履歴行を追加して、emacsを入力して、%include文を追加する場所を手動で見つけられるようにしてくれます。
2つのコマンドマクロができました。"fixup_all.cm" と "fixup.cm" です。前者は、修正しなければならないファイルごとに一度だけ後者を起動します。 そして、"fixup_all" と入力してマラソン編集セッションを開始しました。あとは、#include 文を挿入する場所を見つけて、"^Z-i" と入力し、ファイルを書き出して終了するだけでした。 残りの作業はマクロがやってくれました。
マクロを書くのに時間がかかったとしても、このエディタとコマンドマクロを作成することで、かなりの時間と労力を節約できました(おそらく多少の誤字脱字はあるでしょう)。 また、退屈な作業をはるかに面白い作業に変えてくれました。
この情報がお役に立てれば幸いです。今のところは以上です。