Vim Advent Calendar 2013 97日目:モモンガでもわかるテキストオブジェクトとオペレータ
この記事は Vim Advent Calendar 2013 97日目の記事になります。
Twitter 見ていると『テキストオブジェクトわからん』というツイートをたまに見かけるので自分が理解している範囲で簡単に解説してみるなど。
まぁこういう記事は大量にあると思うけど
わたし自身も少し前までは『テキストブジェクよくわからない』状態だったんですが、どういうものか理解してからはテキストオブジェクトが中心となって Vim を操作するようになりました。
他のエディタでは見かけない癖のある機能だと思いますが、Vim を使用しているのであればテキストオブジェクトとオペレータの関係は覚えておいた方がよいと思います。
[テキストオブジェクトとは]
テキストオブジェクトを一言でいうと『任意の範囲』になります。
例えば normal モードで diw を入力すると『カーソル下の単語』が削除され、yi( で『()内のテキスト』がヤンクされます。
この時に入力した iw や i( がテキストオブジェクトに該当します。
iw は『単語の範囲』、i( は『()内の範囲』という具合です。
他にもデフォルトでは以下の様なテキストオブジェクトが存在します。
キー | 説明 | 対象 | 該当範囲 | |
---|---|---|---|---|
aw | 空白文字を含む単語(WORD) | __homu__ | homu__ | |
iw | 単語(word) | __homu__ | homu | |
aW | 空白文字を含む単語WORD | __(homu,mami)__ | (homu,mami)__ | |
iW | 単語(word) | __(homu,mami)__ | (homu,mami) | |
as | 空白文字を含む文 | - | - | |
is | 文 | - | - | |
ap | 空白文字を含む段落 | - | - | |
ip | 段落 | - | - | |
at | __ |
|||
it | __ |
homu | ||
a" | "" を含む中身 | __"homu,mami"__ | "homu,mami" | |
i" | "" の中身 | __"homu,mami"__ | homu,mami | |
a( | () を含む中身 | __(homu,mami)__ | (homu,mami) | |
i( | () の中身 | __(homu,mami)__ | homu,mami | |
a[ | [] を含む中身 | __[homu,mami]__ | [homu,mami] | |
i[ | [] の中身 | __[homu,mami]__ | homu,mami |
※_ は空白文字、homu 上にカーソルがある場合の該当範囲
他のテキストオブジェクトについては、
:help text-objects
を参照して下さい。
[オペレータとは]
テキストオブジェクトが『任意の範囲』に対して、オペレータは『その範囲に対して何を行うか』という操作にあたります。
先ほど紹介した diw や yi( では、d や y がオペレータに該当します。
d はテキストオブジェクトを『削除』し、y はテキストオブジェクトを『ヤンク』するオペレータという具合です。
デフォルトでは以下の様なオペレータが存在します。
キー | 操作 |
---|---|
c | 変更 |
d | 削除 |
y | レジスタにヤンクする (テキストは変更しない) |
> | 右にシフトする |
右にシフトする | |
zf | 折りたたみを作成する |
他のオペレータについて
:help operator
を参照して下さい。
また、ビジュアルモードでもテキストオブジェクトを対象として選択する事が可能です。
例えば、vi( とすれば()の中のテキストを選択する事ができます。
[テキストオブジェクトとオペレータを組み合わせる]
さて、これでだいたいテキストオブジェクトとオペレータの役割がわかったと思います。
あとは必要に応じて組み合わせて使用していきます。
例えば、
- 『()内のテキストを変更したい』
- 『変更』+『()内』=ci(
- 『カーソルしたの単語を削除したい』
- 『削除』+『単語』=diw
- 『"" という文字列を "" を込みでヤンクしたい』
- 『ヤンク』+『"" を含む範囲』=ya"
と、いうような操作になります。
このように必要に応じてテキストオブジェクトとオペレータを組み合わせて使用することでテキストを直接編集する事なく、normal モードで様々な操作を行うことが可能になります。
[テキストオブジェクトやオペレータの拡張プラグインを使ってみる]
デフォルトでもたくさんのテキストオブジェクトとオペレータがありますが、それ以上に大量の拡張プラグインも存在します。
さすがに全部は量が多すぎるので、便利そうなプラグインをいくつか紹介します。
注意
テキストオブジェクトやオペレータのプラグインを入れる前に予め以下のプラグインをインストールしておく必要があります。
上記の2つのプラグインはテキストオブジェクトやオペレータのプラグインのベースとなるプラグインに当たります。
たいていのテキストオブジェクトやオペレータのプラグインはこれをベースとして作成されています。
[テキストオブジェクト]
- kana/vim-textobj-entire
- バッファ全体
- kana/vim-textobj-line
- 改行コードを含まないカーソル行
- kana/vim-textobj-function
- 関数内
- kana/vim-textobj-indent
- カーソル位置と同じ範囲のインデント
- mattn/vim-textobj-url
- URL
- sgur/vim-textobj-parameter
- 関数の引数
[オペレータ]
- emonkak/vim-operator-comment
- コメントアウトする
- kana/vim-operator-replace
- レジスタを汚さないでテキストオブジェクトをヤンクしたテキストに置き換える
- rhysd/vim-operator-surround
- vim-surround のオペレータ版
- tyru/operator-camelize.vim
- キャメルケースとスネークケースを相互に変換
その他のテキストオブジェクトやオペレータのプラグインは以下のサイトにまとめてあります。
他にも『○○○みたいなテキストオブジェクト(or オペレータ)が欲しいなぁ…』と思ったら探してみるとよいと思います。
[まとめ]
テキストオブジェクトとオペレータは便利なので覚えよう。