vim-users.jp

Hack #26: 複数のバッファを一度に変更する – キーボードマクロ編

Posted at 2009/06/14
このエントリーをはてなブックマークに追加

問題

日常的に複数のファイルを取り扱っていると、同じ変更を複数のファイルに対して行いたい場合があります。Hack #21: 複数のバッファを一度に変更する – :bufdo編では:bufdoなどを用いた方法を紹介しました。:%s/.../.../g程度の単純なものならHack #21の方法でも十分なのですが、時にはExコマンドで指定するには複雑な処理を行ないたい場合があります。

解決方法

複数のファイルを一斉に変更する別の方法としては、キーボードマクロがあります。 キーボードマクロはユーザーが行なった一連の操作を記録し、 後で記録した操作を簡単に繰り返すことができる機能です。

具体例を示しましょう。筆者は過去に自作プラグインのドキュメントのヘッダーにライセンスに関する文章を追記する作業を行ないました。仮にこれを手作業で行なうとすると、以下のような手順になります(ここでは予め作業対象のファイルをargument-listに登録していると仮定します。詳細はHack #11: argument listを利用して複数のファイルを取り扱うを参照してください。またライセンスに関する文章はレジスターcに保存されているものとします):

  1. ヘッダー中の適切な位置に移動し(gg/^Copyright<Return>)
  2. ライセンスに関する文章を貼り付け("cp)
  3. ファイルを保存し(:write<Return>)
  4. 次のファイルを開く(:next<Return>)

キーボードマクロを用いるとこの作業を記録することができます。 記録を開始するコマンドはqmです。 キーボードマクロの記録を終了するにはqをタイプします。 記録したキーボードマクロを実行するには@mをタイプします。

つまり、この例の場合は

  1. キーボードマクロの記録を開始する(qm)
  2. ヘッダー中の適切な位置に移動し(gg/^Copyright<Return>)
  3. ライセンスに関する文章を貼り付け("cp)
  4. ファイルを保存し(:write<Return>)
  5. 次のファイルを開く(:next<Return>)
  6. キーボードマクロの記録を終了する(q)
  7. 任意の回数だけ繰り返す(@m@m@m...としても良いですし、100@mと繰り返し回数を指定することもできます)

という手順で作業を半自動化することができます。

解説

上記の例では説明を簡略化するため

  • 記録を開始するコマンドはqmです。
  • 記録したキーボードマクロを実行するには@mをタイプします。

と説明しましたが、実際にはmに限らずaからzまでの小文字のアルファベットなら何でも構いません。より正確に言えば、キーボードマクロの記録時には入力された操作をどのレジスターに記録するかを指定し、実行時にはどのレジスターの内容を実行するかを指定しています。

レジスターを利用しているということから、以下の応用例が考えられます:

  • バッファ中に操作手順を書き下してそれをyankすることで、実際に操作を行なうことなくキーボードマクロを記録することができます。
  • キーボードマクロの記録途中で操作を失敗した場合でも、記録内容をバッファに貼り付れば編集することができます。
  • qMのように大文字のレジスター名を用いれば既存のキーボードマクロに対してさらに操作を追加することができます。

キーボードマクロの利点は普段のVimの操作を行なうだけでちょっとした作業の繰り返しを簡単に半自動化できることです。上手く使えば作業の効率を大きく上げることができるでしょう。

参考資料

kana

もどる
blog comments powered by Disqus