第 8 章:テキストオブジェクト
これまで削除、変更、コピーの対象は、文字(x)、行全体(dd)、または移動 コマンドで指定した範囲(d$、dw)でした。しかし実際の作業では「引用符内の 文字列を変更する」「この括弧内を削除する」と考えることが多く、文字数を数えたい わけではありません。
ここで Vim の特に便利な機能、テキストオブジェクトの出番です。
テキストオブジェクトとは
テキストオブジェクトは単独のコマンドではなく、一種の「対象」です。演算子 (d:削除、c:変更、y:ヤンク、v:選択)の後ろに付け、構造を持つ どのテキストを操作するか指定します。
テキストオブジェクトは常に 2 文字です。最初の文字は範囲を表します。
iは inner:オブジェクトの内側だけaは around:周囲の記号や空白も含む
2 文字目はオブジェクトの種類(単語、引用符、括弧など)です。
注意:カーソルがオブジェクト内の正確な位置にある必要はありません。オブジェクトの 内側のどこかにあれば使えます。たとえば引用符内のどこにカーソルがあっても、 ci" は引用された内容全体を変更します。
よく使うテキストオブジェクト
単語
iw単語(周囲の空白を含まない)aw単語(片側の空白を含む)
引用符
i"i'i`引用符の内側a"a'a`引用符自体も含む
括弧
i(またはib丸括弧の内側i[角括弧の内側i{またはiB波括弧の内側a(a[a{括弧自体も含む
タグ(HTML/XML)
it<a>と</a>の間など、タグの内側atタグ自体も含む
段落と文
ip/ap段落is/as文
演算子と組み合わせる
テキストオブジェクトは演算子と組み合わせることで力を発揮します。文章のように 読むこともできます。
ciwchange inner word:現在の単語を変更di"delete inner quotes:引用符内の内容を削除ya(yank around parens:丸括弧を含む全体をコピーvi{visually select inner braces:波括弧内を選択dapdelete a paragraph:段落全体を削除citchange inner tag:タグ内のテキストを変更
ヒント:覚え方は「動詞 + i/a + オブジェクト」です。「内側(i)の単語(w)を 変更(c)したい」なら ciw です。
次のコードで練習してください。カーソル位置を変えながら、
ci"で文字列を変更、ci(で引数を変更、di{で関数本体を空にする、citでタグ内を変更する、 といった操作を試します。間違えたらuで元に戻せます。
const greeting = "hello world";
const user = { name: "seven", age: 18, tags: ["vim", "editor"] };
function render(title, content) {
return `<div class="card"><h1>${title}</h1><p>${content}</p></div>`;
}次の組み合わせを試し、違いを体感してください。
hello world上でci"とca"はどう違いますか{ name... }内でdi{とda{はどう違いますか["vim", "editor"]内でvi[は何を選択しますか
テキストオブジェクトを身につけると、少ないキー入力でより正確に編集できます。 これは「Vim を知っている」状態と「Vim を楽しむ」状態の分水嶺です。
次の章では Vim のレジスタとクリップボードを紹介します。