Vimのテキストオブジェクトを使いこなす

2019.11.20.水
Vim

溝畑です。

みなさんVim使ってますか?
自分は2018年末から最近までVSCodeに少し浮気していたのですが・・・。
最近またVimに戻ってきました。

社内のエディタ&IDE勢力はざっくり、VSCode > IntelliJ > Vim, Emacs > その他といった具合。
ばらつきはあるものの、VSCode勢が多く、IntelliJがその後を追うような感じです。
(とくにこれを使え!という決まりはないので、自由に使いたいの使えます)

そんな中、なぜVimから離れられないのかを考えたところ、やはり「テキストオブジェクト」が原因なのかなと。。。

ということで、目新しいものでもないですが、
今回はテキストオブジェクトと、切っても切れないオペレータ&モーションの紹介です。
大分前に社内でLTしたときに話した内容ですが...。

オペレータ→モーション→テキストオブジェクトの順番でいきます。

オペレータ

まずはオペレータです。

みなさん、初めてVimを触ったとき、「削除はddだよ」「コピーはyyだよ」とか教えてもらいましたよね?
このdとかyがオペレータです。

dやyも含めて、他にもいろいろとあります。

vをここに含めてますが、厳密にはビジュアルモードです。(だから特別)

モーション

次にモーション。

これも初めてVimを触ったとき、「移動はhjklだよ」とか、「Gで一番下!」「ggで一番上!」とか教えてもらいませんでしたか?

この手の移動とかがモーションです。

これ以外にもいろいろあります。

テキストオブジェクト

最後にテキストオブジェクト。
例えば、括弧の中、タグの中、'の中"の中などなど、何かしらのルールを持ったテキストのまとまりです。

例えば、


組み合わせる

なんとこの子たち、組み合わせて使えます!

こんなときありませんか?
・括弧の中だけ消したい、ヤンクしたい、変更したい、選択したい
・タグの中を消したい、ヤンクしたい、変更したい、選択したい
・"の中を消したい、ヤンクしたい、変更したい、選択したい

組み合わせると、さくっとできちゃうんです。
例として一番上の括弧を順に見ていきましょう。

・括弧の中だけを消したい場合
di(

・括弧の中だけヤンクしたい
yi(

・括弧の中だけ変更したい
ci(

・括弧の中だけ選択したい
vi(

それぞれ、オペレーターとテキストオブジェクトの組み合わせです。
モーションとの組み合わせは、例えばdGなんかすると、「今いるとこから下を全部消す」になります。

よーく見てもらうと、一番前のオペレーターを変えているだけで、後ろ全部i(ですね。
間のiをaにしたり、組み合わせを変えればよいだけなので、少し覚えると、使えるコマンドがかなり増えるのも特徴です。


Vimちょっととっつきにくいなと思ってた人も、この辺りを一度経験してみると、多分Vimやめられなくなります。

それでは、良いVimライフを。