こんにちは、Vim 使いの「ブイ」(仮名)です。第 8 回目のテーマは「テキストオブジェクト」です。この機能は比較的最近追加されたので、きちんと使いこなせる人が少ないような印象を受けます。テキストオブジェクトをうまく使いこなせれば、編集作業が楽になること間違いないです。
1 テキストオブジェクトとは¶
テキストオブジェクトとは、特定の文字に囲まれた領域のことです。例えば、「() で囲まれた領域」や「”” で囲まれた領域」、「html のタグで囲まれた領域」をテキストオブジェクトといいます。どの領域をテキストオブジェクトとするかは、後述の textobj-user.vim という外部プラグインによりカスタマイズすることができます。
テキストオブジェクトは、”d” や “y” といったキーマッピングの対象として指定することができます。そのとき、「囲んでいる文字を含めたテキストオブジェクト丸ごと」を対象とするのか「テキストオブジェクトの中身」を対象とするのかを指定します。例を挙げましょう。下記のような Lisp コードを編集しているとします。ただし、”...” の部分には何行あるか分からないとします。
((hoge
...
piyo piyo piyo) hogera hogera)
上記のコードの '(hoge ... piyo piyo piyo)'
の中身を削除したいとします。”(hoge...” の内側にカーソルを合わせ、di(
を入力しましょう。この操作は、”delete inner ( block” と読みます。”(” に囲まれた内側の領域を削除するという意味です。
((hoge
...
piyo piyo piyo) hogera hogera)
今度は、(hoge ... piyo piyo piyo)
を丸ごと削除したいとします。先ほどと同様、”(hoge...” の内側にカーソルを合わせ、da(
を入力しましょう。この操作は、”delete a ( block” と読みます。”’” に囲まれた領域そのものを削除するという意味です。
di'
のように、di(
の “(” を “’” に変更すると、’’ に囲まれた領域を削除することができます。
テキストオブジェクトの操作は普通、{オペレータコマンド}{テキストオブ
ジェクト}
という構文で表されます。テキストオブジェクトには “i’” のようにテキストの領域を指定する文字を指定します。テキストオブジェクトのオペレータコマンドとは、d や y といった、後ろに操作対象(オペレータ)を取るコマンドのことです。
Vim で使用できるテキストオブジェクトの一覧は、:help text-objects
を参照してください。よく使うものでいうと、a[
や a<
、a{
、ap
などがあります。
2 テキストオブジェクトと移動コマンドの違い¶
テキストオブジェクトと通常の移動コマンドの違いを説明しておきます。例えば d/'
とした場合、「カーソル位置から “’” までを削除」します。つまり、暗黙的にカーソル位置が操作対象に含まれているため、カーソルがどこにあるかによって結果が異なります。da'
のようにテキストオブジェクトを使用した場合は、「カーソル位置にある ‘’ で囲まれた領域」を削除することになります。つまり、テキストオブジェクトを使用した場合には、対象の領域の内側にさえ居ればカーソルがどこにあっても同じ結果を得ることができます。カーソルの位置をほとんど気にしなくてよいので、その分楽になります。
3 surround.vim¶
Vim のテキストオブジェクトに対する基本機能では、領域の中を表す i か領域を丸ごと表す a しか使えません。外部プラグインの surround.vim はそれを更に拡張し、領域を囲んでいる文字 (surround) を操作することができます。
http://www.vim.org/scripts/script.php?script_id=1697
例えば、下記のソースコードがあったとします。
print 'hoge'
この ‘hoge’ を “hoge” に変更したいとします。これは比較的よくある操作です。そういうときには、surround.vim をインストール後 cs'"
を入力します。この操作は、”change surround ‘ to “” と読みます。
cs
以外にも囲んでいる文字を削除する ds
もよく使用されます。
4 textobj-user.vim¶
Vim は標準でもいくつかのテキストオブジェクトを定義していますが、textobj-user.vim は新たなテキストオブジェクトを定義することができる外部プラグインです。単体では意味がありませんが、textobj-user.vim を使用してテキストオブジェクトを定義しているプラグインと併用することで、新たなテキストオブジェクトが利用可能となります。
厳密には、textobj-user.vim を使用しなくてもテキストオブジェクトを自作することは可能です。しかし、textobj-user.vim は複雑なテキストオブジェクトの決まりごとを吸収してくれるので、テキストオブジェクトを自作するときは textobj-user.vim を使用するべきです。
http://www.vim.org/scripts/script.php?script_id=2100
次回は Vim の「タブ」機能について解説する予定です。