Skip to content

第 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

演算子と組み合わせる

テキストオブジェクトは演算子と組み合わせることで力を発揮します。文章のように 読むこともできます。

  • ciw change inner word:現在の単語を変更
  • di" delete inner quotes:引用符内の内容を削除
  • ya( yank around parens:丸括弧を含む全体をコピー
  • vi{ visually select inner braces:波括弧内を選択
  • dap delete a paragraph:段落全体を削除
  • cit change inner tag:タグ内のテキストを変更

ヒント:覚え方は「動詞 + i/a + オブジェクト」です。「内側(i)の単語(w)を 変更(c)したい」なら ciw です。

次のコードで練習してください。カーソル位置を変えながら、ci" で文字列を変更、 ci( で引数を変更、di{ で関数本体を空にする、cit でタグ内を変更する、 といった操作を試します。間違えたら u で元に戻せます。

javascript
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 のレジスタとクリップボードを紹介します。