Vim の文字の削除方法まとめ(テキストオブジェクト) (d, delete)

Vim にはテキストを削除ための様々なキーコンビネーションが用意されています。 最初はたくさんあって面食らいますが、体系的な組み合わせになっているので意外と覚えやすいです。 これらのキーコンビネーションを使いこなすと、他のエディタでは決して真似できない爆速テキスト編集が可能になります。

ノーマルモードでの削除

削除の基本

入力説明
x1 文字削除(カーソル位置)
X1 文字削除(カーソルの前)
dd1 行削除(cc だとさらにインサートモードに移行)
D行末まで削除(C だとさらにインサートモードに移行)

このキーマッピングだけは基本的な削除操作として覚える必要があります。 特に重要そうなものはハイライトしています。

削除系操作の詳細は、:help deleting で確認できます。

オペレーター + 移動コマンド

d オペレーターに続けて、1 文字の 移動コマンド を指定することで、カーソル位置からその位置までのテキスト を削除することができます。 例えば、次の単語へジャンプする移動コマンド w と組み合わせて、dw と入力すると、カーソル位置から次の単語までのテキストを削除することができます。 下記は、d オペレーターと移動コマンドの組み合わせによるテキスト削除の例です。

入力説明
d0カーソル位置から行頭まで削除
d^カーソル位置から行頭まで削除(インデントは残す)
d$カーソル位置から行末まで削除(D でも可)
dwカーソル位置から単語の末尾まで削除(スペースも削除)
deカーソル位置から単語の末尾まで削除(スペースは残す)
dbカーソル位置から単語の先頭まで削除
df{X}カーソル位置から文字 {X} まで削除
dF{X}カーソル位置から文字 {X} まで削除(前方検索)

web といった単語単位の移動コマンドは、日本語文章では、連続する「漢字」「ひらがな」「カタカナ」を 1 つの単語とみなしてジャンプします。 日本語文章でもスペースを単語の区切りとしてジャンプするには、大文字の WEB を使用します。

  • 参考: 「オペレーター」の詳細: :help operator
  • 参考: 「移動コマンド」の詳細: :help motion

オペレーター + テキストオブジェクト

移動コマンドの代わりに、a{X}i{X} という 2 文字の形式で表現される テキストオブジェクト を使うと、カーソル位置を含む様々な範囲のテキスト を削除することができます。 前述の移動コマンドに比べ、カーソル位置が削除対象とするテキストのどこかにあればよいので、効率のよいテキスト削除が可能です。 例えば、iw というテキストオジェクトは、カーソル位置にある単語を示します。 a{X} の方が、i{X} よりも少し広い範囲を表現します。 下記は d オペレーターを使ったテキスト削除の例です。

入力説明
dawカーソル位置の単語を削除
diwカーソル位置の単語を削除(後ろのスペースを残す)
dasカーソル位置の英文を削除
disカーソル位置の英文を削除(後ろのスペースを残す)
diW(日本語向け)カーソル位置のテキストをスペースを区切りとして削除
dapカーソル位置の段落を削除
dipカーソル位置の段落を削除(後ろのスペースを残す)
da)() で囲まれたテキストを削除
di)() で囲まれたテキストを削除(括弧を残す)
da][] で囲まれたテキストを削除
di][] で囲まれたテキストを削除(括弧を残す)
da><> で囲まれたテキストを削除
di><> で囲まれたテキストを削除(括弧を残す)
da}{} で囲まれたテキストを削除
di>{} で囲まれたテキストを削除(括弧を残す)
datHTML/XML 要素を削除
ditHTML/XML 要素を削除(開始終了タグを残す)
  • 参考: 「テキストオブジェクト」の詳細: :help text-objects

テキストオブジェクトの範囲を確認してから削除する

慣れないうちは、移動コマンドやテキストオブジェクトの指定によって実際にどの範囲のテキストが削除されるのかが分からないと思います。 その場合は、v キーでビジュアル選択モードに入り、テキストオブジェクトなどの範囲を視覚的に確認してから削除コマンド (d) を実行するとよいです。 例えば、以下のようにすると、テキストオブジェクト as の範囲(1 文)をハイライト表示で確認してから削除できます。

  1. vas で削除範囲を確認
  2. d で実際に削除する(c ならさらにインサートモードに入る)

インサートモードでの削除

i を入力した後のインサートモード(挿入モード)では、あまり高度な削除操作はできませんが、次のキー操作を覚えておくと便利です。

入力説明
C-uカーソル位置から行頭まで削除
C-wカーソル位置から単語の先頭まで削除

正確には、どちらもインサートモードを開始した位置までが削除対象となります。 例えば、C-a で行末からインサートモードに入った場合は、C-u による削除範囲はその時点での行末までになります(もう一度 C-u を入力すれば行頭まで完全に削除されます)。

コマンドラインモードでの削除

行番号で指定した行特定の文字列を含む行 を削除したい場合は、: キーで起動するコマンドラインモードで、行範囲指定と組み合わせて d (delete) コマンドを実行します。 コマンドラインモードでは最初に行範囲を指定することに注意してください。 これは置換コマンドの s の対象範囲を指定する場合も同様です。

行範囲を指定した削除
:行範囲 d

行範囲を指定しない場合は、カレント行のみが対象になります。 つまり、:d というコマンドは、dd と同様にカレント行のみを削除します。

入力説明
:dカレント行を削除
:% dすべての行を削除
:1,10 d1〜10 行目を削除
:g/temp/ dtemp を含む行を削除
:g/^#/ d# で始まる行を削除
:g/^$/ d空行をすべて削除

ノーマルモードでの削除操作と比べると、コマンドラインモードでの削除はあまり使わないかもしれません。