
はじめて vim(vi?) を使ったのは今から15年以上前。ただずーっと使っている訳じゃなくて、vim のスキルと言えばj とか k とかでチマチマとカーソル移動することや wqで終了したり、ノーマルモード( ESC )、挿入モード( i )、コマンドモード( : )とかを行き来して最低限のファイル編集が出来るだけでした。
数年に一度くらい vim な気分になる時があって都度チャレンジてみるもののいまいち進歩せず。vim 幼稚園をいつまでたっても卒園できない。。みたいな。
使える vim っぽいコマンドと言えば gg とか G くらいで進歩なし。
そんな私が昨年くらいから vim を使うようになりました。今度は今までと違う。やっと vim 幼稚園を卒業できたっぽい。
きっかけは、今回紹介するテキストオブジェクト。これが vim 幼稚園卒業の大きなきっかけのひとつです。
テキストオブジェクトとは?
テキストオブジェクトとはカッコ「()」とかダブルクォート「”」だとかシングルクォート「’」などで囲まれた「あるひとかたまり」だと思うとわかりやすい(と思う)。
そして、そのかたまり(テキストオブジェクト)単位で様々な操作がサクッとできることがめっちゃ便利で、めっちゃ vim っぽい(と思う)。
テキストオブジェクトを操作してみる
基本的に、ノーマルモードで操作します。
具体的には、
d (削除)または、
c (削除して挿入モードへ)または、
y (ヤンク)または、
v (選択)
に続けて i または a を押して、
s (文)または、
p (段落)または、
w (単語:word)または、
W (単語:WORD)または、
囲み記号( " とか ' など)
を押します。合計3文字。
1文字目は操作内容、
2文字目は内部/外部指定、
3文字目は操作対象です。
一度に全てを覚えるのは大変なのでとりあえず、
操作内容(1文字目)は、d と c のみ。
内部/外部指定(2文字目)は、i のみ。
操作対象は、w と囲み文字( " とか ( など)のみ
から覚えていくと良いとおもいます。これだけでも十分便利です。
テキストオブジェクトの具体的な操作例
例えば、
diw で、カーソル位置にある単語が削除されます。
di" で、”” で囲まれている単語が削除されます。
di' で、” で囲まれている単語が削除されます。
di< で、<> で囲まれている単語が削除されます。
di{ で、{} で囲まれている単語が削除されます。
di( で、() で囲まれている単語が削除されます。
di[ で、[] で囲まれている単語が削除されます。
具体的には「 "T|his is a pen." 」( | はカーソル位置)だった場合に、
diw で、「 "| is a pen." 」となります。
di" で、「 "|" 」となります。
また、1文字目の d を c に変えれば、それぞれ削除されたあとに、挿入モードになります。
ciw で、カーソルがある単語が削除されて挿入モードへ。
ci" で、"" で囲まれている単語が削除されて挿入モードへ。
ci' で、'' で囲まれている単語が削除されて挿入モードへ。
ci< で、<> で囲まれている単語が削除されて挿入モードへ。
ci{ で、{} で囲まれている単語が削除されて挿入モードへ。
ci( で、() で囲まれている単語が削除されて挿入モードへ。
ci[ で、[] で囲まれている単語が削除されて挿入モードへ。
ちなみに w (単語)を指定する場合、" とかで何にも囲まれてなくても、
diw とすれば、上記の通りカーソル位置の単語が削除できちゃいますが、実はこれ「空白文字で囲まれている」ということみたいです。
囲み文字の特殊系
3文字目の囲み文字( ( など)として t が指定できます。
これはタグ(HTMLタグ)を表します。なので、
d
i
t で、HTML タグに挟まれている文字列を削除します。
c
i
t で、HTML タグに挟まれている文字列を削除して挿入モードへ。
具体的には、
「 <a href="http://www|.yahoo.co.jp">Yahoo! Japan</a> 」( | はカーソル位置)の場合、
d
i
t で、
「 <a href="http://www.yahoo.co.jp">|</a> 」となります。
c
i
t で、
「 <a href="http://www.yahoo.co.jp">|</a> 」となり挿入モードへ。
通常の囲み文字(" とか ' とか)の場合は、カーソルが " とか ' で挟まれている中にないといけませんが、t の場合は、行のどこにカーソルがあっても構いません。
HTML を編集する場合、c
i
t でめちゃくちゃ捗りますよ。
2文字目の内部/外部指定とは?
とりあえず、i のみを使ってきましたが、2文字目には a を指定することもできます。
d
a
" とか
d
a
< とか
2文字目に a を指定した場合は、操作対象に囲み文字も含まれます。囲み文字(" とか ' など)を含めて、削除したりできます。
i になれてきたら a も使ってみてください。私はあんまり使いませんが。。なにせ、やっと卒園なもんで。
まとめ
以上、つらつらと説明してきましたがテキストオブジェクトを知ったことによって、「なるほど、vim ってこうやって使うんだ。だから vim なんだ」と勝手に理解しました。もちろん テキストオブジェクトは vim の良さの一部でしかありませんが。
様々なテキストエディタがありますが、テキストオブジェクトの操作感は vim を使うモティベーションのひとつです。
一応、vim で編集できるけど。。いまいち vim の良さがわかんない、って人はぜひぜひテキストオブジェクトにチャレンジしてみてください。きっと「なるほど!」って思いますよ(多分)。
でわでわ。