Vimのテキストオブジェクトについてまとめた

More than 5 years have passed since last update.


テキストオブジェクトって何?

Vim7位から追加された概念

あるルールに基づいたテキストのまとまり


何が良いの?

オペレータと組み合わせて、テキストオブジェクト単位での編集ができる


オペレータ?

テキストを削除したり、編集したりするコマンド


主なオペレータ

キー
オペレーション

c
変更

d
削除

y
yank

~
大文字/小文字入れ替え

gu/gU
全て小文字/大文字


テキストオブジェクトと組み合わせるのってどうするの?

オペレータコマンド + (回数指定) + 内部/外部指定 + テキストオブジェクトの種類の指定


よくわかんないので具体的に

こんなテキストがある時(|は、カーソル位置)

kp3k3 "te|st" 2jo2jp

vi" を押下すると、以下のように、ビジュアルモードで選択される(~~~~ は選択範囲)

kp3k3 "te|st" 2jo2jp

~~~~~

vi" で、 カーソル上の " で囲まれている文字列の内部を、ビジュアルモードで選択 という意味になる


それぞれのコマンドの意味

v : ビジュアルモードで選択

i : inner

" : "で囲まれている文字列


内部/外部指定

a : テキストオブジェクト全体を指定(a)

i : テキストオブジェクト内部を指定(inner)

vi"

kp3k3 "te|st" 2jo2jp
~~~~~

va"

kp3k3 "te|st" 2jo2jp
~~~~~~~

va" だと、" も含まれる


テキストオブジェクトの種類(よく使いそうなやつ)

キー
意味

w
word . とか , とか、単語を区切りそうな文字列までの連続
set iskeyword で、区切り文字以外の文字列を確認可

W
WORD 非空白文字の連続

[,(,{,<,",`
左の記号で囲まれている文字列

b
block ブロック。() 等カーソル位置から直近の囲み文字の範囲(前方一致)

B
block ブロック。() 等カーソル位置から直近の囲み文字の範囲(後方一致)

t
htmlタグ


便利なテキストオブジェクト拡張プラグイン


surround.vim

tpope/vim-surround

囲み文字を対象にするテキストオブジェクト(s)を追加するプラグイン

ys[範囲][記号] -> 記号で範囲を囲む

cs[記号] -> 記号を置換

ds[記号] -> 記号を削除

S[記号] -> 選択範囲を記号で囲む


ysiw" -> カーソル上の単語を " で囲む


vim-textobj-ruby

rhysd/vim-textobj-ruby

ruby のブロックを対象にするテキストオブジェクト(r)を追加するプラグイン


dir : if 〜 end の中身を削除


参考