こんにちは。Emacs 担当の金内です。
今日はみんな大好きな Emacs でテキストファイルを処理するときに役立つ「キーボードマクロ」という機能を紹介します。
どんな時に役に立つの?
ふだんの暮らしの中で、CSV のような行を中心としたテキストデータを扱う機会がよくあると思います。たとえば、1行に 3 つデータがある CSV で、いちばん左のデータだけを削除したい場合、どうするでしょうか?
たとえばこんなファイルです。
abcd,ef,ghi jk,lmno,pqr stu,vwx,yz0 ...(2000行くらい続く)
これを次のようにしたいわけです。
ef,ghi lmno,pqr vwx,yz0 ...(2000行くらい続く)
正規表現やスクリプト言語などいろいろと選択肢はありますが、ここではあえて、Emacs の操作さえわかっていればできてしまうキーボードマクロを使ってみましょう。
キーボードマクロとは
「キーボードマクロ」は、Emacs でのキー操作を記録して、何度でも実行できる機能です。記録を開始するには F3 キーを押します。ここから F4 キーを押すまでの操作が記録されます。カーソル移動やリーション操作、インクリメンタルサーチなど一通りの操作を記録できます。
何をマクロとするか決める
今回のような作業をキーボードマクロこなす手順は次のようになります。
- 1. ある行を目的どおり処理するキーボードマクロを定義する
- 2. マクロをすべての行に適用する
では、1行目を例にどんな処理が必要か考えてみましょう。
abcd,ef,ghi
この行から、次のように1つめのデータを削除したいわけです。Emacs の操作で実現するにはどうすればいいでしょうか?
ef,ghi
カーソルが行頭にあるとすると次のように考えられます。
- 1. リージョン指定(選択)を開始する(Ctrl-SPC)
- 2. インクリメンタルサーチで最初のコンマの次までカーソルを移動する(Ctrl-s , ENTER)
- 3. リージョン(行頭からコンマまで)を削除する (Ctrl-w)
これをマクロにすればよさそうですね。ポイントは、どの行でも適用できるような操作にすることです。データの文字数など、行ごとに変化するものはアテにできません。
さっそく記録してみる
心の準備はいいでしょうか?
では、1行目の左端にカーソルを置いて、まずは F3 を押してマクロを記録開始しましょう。
先ほどの手順どおり(別の方法でも構いません)操作して、無事に1つめデータを削除できたら F4 を押してマクロ記録を終了します。
途中で失敗してもあわてる必要はありません。いったん F4 で記録を終了して、F3 でもう一度最初から記録開始してください。
ためしてみる
記録したマクロは Ctrl-x e で実行できます。さっそく 2 行目で試してみましょう。うまくいきましたか?
うまくいったら 3 行目でも試してみてください。うまくいかない場合は、もう一度最初からマクロ記録しましょう。
すべての行に適用!
うまくいったら、マクロをすべての行に適用します。ここで先ほどの Ctrl-x e を連打!!というのはちょっと野暮なのでやめておきましょう。
まずは適用したい行をすべてリージョン指定(選択)します。そして、おもむろに Ctrl-x Ctrl-k r を押します。
さぁ、いかがですか?マクロがすべの行に適用されて、1つめのデータが削除されているはずです。ちなみに、Ctrl-x Ctrl-k r は apply-macro-to-region-lines というコマンドを呼び出しています。
こうして、1行ずつ手でやっていたら気の遠くなるような作業も一撃で済んでしまうわけです。
まとめ
今回のマクロはかなり単純なものですが、キー操作なら何でも登録できてしまうので、かなりいろんな場面で使えます。
再利用性など考えず、その場で必要なマクロを定義して、使ったら、あとは忘れてしまって構いません。
最近使ったマクロとしては、「ダブルクオーテーションに囲まれた中身だけをコピーする」「リージョンを p タグで囲む」などのマクロが役に立ちました。「単純作業だけど、スクリプトを書くのもちょっと面倒」という時はキーボードマクロでさくっと仕事を終わらせて、まわりのみんなにドヤ顔をご披露ください。
参考: Keyboard Macros : GNU Emacs Manual
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!