Vim のテキストオブジェクトと surround.vim で効率よく入力
これはVim 駅伝の 13 本目の記事です。
テキストオブジェクトとは
皆さんは、テキストオブジェクトを活用しているでしょうか。 私は、特に HTML を書く時にテキストオブジェクトを活用しています。
テキストオブジェクトは、Vim7 から導入された新しい概念であり、記号などで囲まれたテキストをオブジェクトとして扱うことができる、Vim の機能です。 具体的には、カッコやダブルクオーテーションやタグ等で囲まれているテキストの削除、コピー、変更を簡単に行なう事が出来るようになります。
実際にテキストオブジェクトを使う場面
では、実例を考えてみましょう
例1)記号で囲われたテキストの中身を削除する
例えば、下記のようなコードがあったとします。
function (arg1,arg2,arg3) {
}
(arg1,arg2,arg3)と書かれた所を一気に削除したい事がありますよね。 通常の削除処理ではdwdwdwdwと連打して消すとか、5dwで消すというやり方が思い浮かぶかもしれませんが、テキストオブジェクトの場合、下記の操作で削除出来ます。
di( または di)
実際に、上記コードをコピペして、やってみてください。 ()内であればどこででもこの操作は有効です。
同じような例として
const str = "Hello, World";
のように、ダブルクオーテーションで囲まれた文字列を削除したい場合は、
di"
で削除する事が出来ます。
例2)記号で囲われたテキストの中身を変更する
例えば、下記のようなコードがあったとします。
function (arg1,arg2,arg3) {
}
(arg1,arg2,arg3)と書かれた所を一気に変更したい事がありますよね(デジャブかな?)。 そんな場合、下記の操作で変更出来ます。
ci(
と入力すると、()の内側を消して、入力モードになります。 そのままタイプすれば、中身を変更することが出来ます。
同じような例として
<h1>sample title</h1>
のように、タグで囲まれた文字列を変更したい場合は、
cit
と入力すると、タグの内側を削除して入力モードになります。
例3)記号で囲われたテキストの全てを削除する
ここまでは、記号で囲まれたテキストの内側を変更する操作でしたが、記号で囲まれたテキストを全て削除したい場合ありますよね。 例えば、
<ul>
<li>apple</li>
<li>banana</li>
<li>orange</li>
<li>grape</li>
</ul>
このようなリストがあって、li タグ全てを削除したい場合、ul タグの位置に移動して、
dat
と入力することで全部削除する事が出来ます。 特に、HTML や XML を編集する際に、非常に力を発揮する操作です。
テキストオブジェクトの覚え方
こんなオペレーションどうやって覚えればいいか分からないという方がいらっしゃるかもしれませんが、オペレータを覚えれば簡単です。
オペレータ名 | 英語表記 |
---|---|
d | delete |
c | change |
y | yank |
v | visual |
これに、下記の操作を組み合わせます
オペレータ名 | 英語表記 |
---|---|
a" | a double quoted string |
i" | inner double qoted string |
at | a tag |
it | inner tag |
自分は、a ~みたいな覚え方は出来なかったので、all,inという感じで覚えています。 all と in は、正規の考え方では無いので、ご注意ください。 自分は、この記事書くまで由来をちゃんと知らなかったです。
surround.vim とは
surround.vim は囲っている記号などを操作する時に役立つプラグインであり、先のテキストオブジェクトと組み合わせて使うとかなり楽に編集が出来ます。
実際に surround.vim を使う場面
例えば、タグを差し替えたい時があります。
<div>とても長いテキストとても長いテキストとても長いテキストとても長いテキストとても長いテキストとても長いテキスト</div>
この場合、
cst<span>
と入力すると、div タグで囲われた文字列を、span タグで囲われた文字列に修正する事が出来ます。
他にも、
const str = "Hello, World";
のような文字列をダブルクオーテーションからシングルクォーテーションに変えたい場合、
cs"'
と入力するだけで置き換える事が出来ます。 surround.vim もオペレーションは同じで、あとは a と i の場所を s に入力切り替えするだけで使えるようになります。 テキストオブジェクトの操作方法と同じ感覚で文字を編集できるこのプラグインはとても強力なので、導入をオススメいたします。
最後に
Vim 使いの方々からすると、ごく常識的な事だったと思いますが、日常的に使っている Tips としてぜひ紹介したかったので書きました。 テキストオブジェクトを覚えてからは、他のエディタで同じオペレーションをしてしまい、色々と憤死しそうになります。 Vim 系列のエディタ以外が使えない身体になっていますが、後悔はしていません。
ちなみに、自分は Vim 系以外でこの概念を持ったエディタを知らないのですが、他のエディタにはこういう編集方法って存在するんでしょうか。 識者の方に是非教えて頂きたいです。
コメント
コメントを投稿