vim-users.jp

Hack #86: キーボードマクロで繰り返し作業を半自動化するポイント

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

問題

Hack #71: 編集操作を繰り返すでは .コマンドを用いて単純な編集操作を繰り返し行う方法について 解説しました。.コマンドを知っているかいないかで テキスト編集の効率は大きく変わります。

ところが.コマンドには欠点があります。 複数のコマンドから成る複雑な編集操作を繰り返すことができないのです。 ちょっとした単語置換程度であれば :%s/ujihisa/curry/で済ませられるのですが、 より複雑なテキスト、特に複数行に渡るテキストに置き換えようとすると :sで行なうことは非常に困難です。

このような場合は Hack #26: 複数のバッファを一度に変更する – キーボードマクロ編 でも紹介したキーボードマクロを使えば可能です。 しかし

  • qmで編集操作を記録開始」
  • qで記録終了」
  • @mで記録した編集操作を実行」

と操作方法を知っても、 それだけですぐに繰り返し作業をすらすらと半自動化するのは困難です。

例えば以下のようなテキストがあったとしましょう (行番号は説明のためのもので実際のテキストの一部ではありません):

 1  " Actions
 2
 3  above
 4  below
 5  cancel
 6  cd
 7  default
 8  ...
 9
10  " __END__

これの3行目を編集して以下のようなテキストにしたとします:

 1  " Actions
 2
 3  function! ku#action#common#above(candidate)
 4    return 'FIXME: Not implemented yet'
 5  endfunction
 6  below
 7  cancel
 8  cd
 9  default
10  ...
11
12  " __END__

次にこの編集操作を6行目以降についても繰り返したいとします。 100@mなどとして以降の操作を半自動化するためには どのようにキーボードマクロを使えばよいのでしょうか。

解決方法

キーボードマクロで繰り返し作業を半自動化する際のポイントは以下の通りです:

  • 編集操作を行なう位置に移動する。
  • 編集操作を行う。

この2点に留意してキーボードマクロの記録を行ないます。

例えば先程例示したテキストの場合:

 1  " Actions
 2
 3  above
 4  below
 5  cancel
 6  cd
 7  default
 8  ...
 9
10  " __END__
  1. キーボードマクロの記録を開始する前に2行目に移動しておきます(2gg)。
  2. キーボードマクロの記録を開始します(qm)。
  3. 編集操作を行なう位置(=3行目)に移動します(j)。
  4. 編集操作を行ないます(Ifunction! ku#action#common#<Esc>A()<Return>return 'FIXME: Not implemented yet'<Return>endfunction<Esc>)。
  5. キーボードマクロの記録を終了します(q)。

以上の操作により記録したキーボードマクロの実行を繰り返すと以下のようなテキストが得られます:

 1  " Actions
 2
 3  function! ku#action#common#above()
 4    return 'FIXME: Not implemented yet'
 5  endfunction
 6  function! ku#action#common#below()
 7    return 'FIXME: Not implemented yet'
 8  endfunction
 9  function! ku#action#common#cancel()
10    return 'FIXME: Not implemented yet'
11  endfunction
12  function! ku#action#common#cd()
13    return 'FIXME: Not implemented yet'
14  endfunction
15  function! ku#action#common#default()
16    return 'FIXME: Not implemented yet'
17  endfunction
18  ...
19
20  " __END__

例示したステップ1/3/4の内容を実際に行いたい編集作業に合わせて変更すれば、 ほとんどの編集作業が半自動化できます。

また、 ここでは例を単純化するためにカーソル移動はjなどの単純なものを用いましたが、 実際にはより複雑な位置調整をするケースもあります。 この場合はjwなどのカーソル移動だけでなく、 /{pattern}nを用いて 該当箇所を直接指定して移動するとよいでしょう。 その際には Hack #70: 正規表現でマッチする範囲を制限する で解説されている\zs\zeを知っておくと より便利にキーボードマクロを使うことができます。

参考資料

kana

もどる
blog comments powered by Disqus