読者です 読者をやめる 読者になる 読者になる

Vim のブログ

テキストエディター Vim の魅力、使い方のコツを初心者にも分かりやすく伝えていきたいと思います。

このブログの目次

はじめに

Vim の使い方 基礎編

Vim のカスタマイズ

Vim プラグインについて

Vim のテキスト編集 〜テキストオブジェクト編〜

Vim は、カーソル前後にある「HTMLタグの内側」、「引用符を含む文字列全体」といった一定の規則を満たしたテキストを、テキストオブジェクトとして一連のコマンドで指定することが出来ます。

Vim では、オペレータービジュアルモードの対象となるテキストの指定にこの「テキストオブジェクト」を使うことが出来ます。

Vim のテキストオブジェクトを指定するコマンドは、a もしくは i から始まります。
a は around の略で、 i は inner の略だと考えると覚えやすいと思います。

ヘルプの

:h text-objects

から利用できるテキストオブジェクトの一覧を参照できます。

Vim のテキスト編集 〜ビジュアルモード編〜

ビジュアルモードは、テキスト選択のためのモードです。編集対象となるテキストを事前に「視覚的に」確認することが出来るので、「ビジュアルモード」と呼ばれます。

ビジュアルモードを開始するためのコマンド一覧

ビジュアルモードを開始するためのコマンドは3種類あり、それぞれに対応するビジュアルモードも細かく3種類に分かれます。それぞれのビジュアルモードは、対象とするテキストの範囲が違います。

コマンド開始できるビジュアルモード 
v 通常のビジュアルモード 文字単位でテキストを選択することが出来ます。
V 行指向ビジュアルモード 行単位でテキストを選択することが出来ます。
<c-v> 矩形ビジュアルモード 箱状にテキストを選択することが出来ます

ビジュアルモード中に選択範囲変更に利用できるコマンド

一般的なテキストエディターでは、既存のテキストの選択中に新たに文字を入力すると、選択したテキストを削除して、新しい文字列の挿入が行われますが、Vim では、全く違った挙動をします。

ノーマルモードと全く同様のカーソル移動コマンドがひと通り利用可能で、移動により選択範囲を広げることが出来ます。

テキストオブジェクトを指定して選択範囲を指定することも出来ます。

ビジュアルモードを終了させるコマンド

テキストの挿入のコマンドは使えません。ただし、下の通り c (変更コマンド)を使うことは出来ます。

選択したテキストに対して、d (削除), y (コピー), c (変更)といったオペレーターをそのまま実行することが出来ます。

<esc> でテキスト選択を解除してノーマルモードに戻ることが出来ます。

コマンド機能
c 選択されたテキストを変更する。つまり削除してインサートモードに入る。
d 選択されたテキストを削除してレジスタ(クリップボードのようなもの)に格納する。
y 選択されたテキストをヤンク(コピー)する。
<esc>
<c-[>
<c-c>
選択を解除する

Vim のテキスト編集 〜基礎編〜

Vimカーソル移動テキストの挿入以外に、一般的なテキストエディターで言うところのカット、コピー、ペーストといったテキスト編集のためのコマンドも充実しています。
テキスト編集のためのコマンドは、オペレーターと対象テキスト指定とを組み合わせることで様々な応用が出来る様になっています。最初は少しむずかしいのですが、慣れるとテキストのいろいろな部位を手軽に素早く切り貼り出来るようになります。

オペレーター

他のコマンドと組み合わせて利用できる、テキスト編集のためのコマンドを「オペレーター」といいます。
特に重要なのは下の3つのオペレーターです。

オペレーター編集機能備考覚え方
y コピー
ヤンク
Vim ではコピーの事をヤンクといいます。対象のテキストが、レジスタに格納されます。 yank, copy
d 削除
切り取り
Vim では削除と切り取りが同じコマンドになっており、削除と同時に、削除したテキストがレジスタクリップボードのようなもの)に格納されて、貼り付け(Put)できるようになります。 delete
c 変更 オペレーター c を使うと、テキストを削除して、その場所からインサートモードを開始してテキストを挿入することが出来ます。
d(削除) と i(挿入) の組み合わせに近いのですが、c (変更)を使うと、後で . (ピリオド)コマンドで2つをまとめて繰り返すことが出来ます。
change

行全体をコピー、削除、変更

上のオペレーターを2回繰り返して入力すると行全体を対象にすることが出来ます。

コマンド編集機能
yy 行全体をコピー
dd 行全体を削除、切り取り
cc 行全体を変更

カーソルから行末までを削除、変更

オペレーターを大文字にして入力すると、カーソルから行末までを削除、変更することが出来ます。
コピー(ヤンク)に限ってはこの通りではありません。これは vi との互換性維持のためだそうですが、カスタマイズして他のオペレーターに合わせることも出来ます。

コマンド編集機能
Y 行全体をコピー (カーソルから行末までのコピーではないので注意!)
D カーソルから行末までを削除、切り取り
C カーソルから行末までを変更

移動コマンドでオペレーターの影響範囲を指定する

オペレーターに続けて、カーソル移動コマンドを入力することで、その移動する分をオペレーターの影響範囲とすることが出来ます。

コマンド組み合わせ例結果
ce カーソル位置から単語の末尾までを変更
dj カーソル行とその次の行を削除
ct" カーソル位置から同じ行の " の手前までを変更

ビジュアルモードでオペレーターの影響範囲を指定する

先にビジュアルモードでテキストを選択してから、オペレーターを実行することも出来ます。

テキストオブジェクトでオペレーターの影響範囲を指定する

オペレーターコマンドの後にテキストオブジェクトを指定することも出来ます。

コマンド組み合わせ例結果
ciw カーソル位置にある単語を変更
daw カーソル位置にある単語を削除
da' '〜'で囲まれた文字列全体を削除
cit HTMLタグの内側を変更
yi( 括弧の内側をコピー(ヤンク)

コピー、削除したテキストを貼り付ける(Put)

Vim では、テキストの貼り付けをペーストではなくて、Put といいます。コピー、削除、変更した対象のテキストを別の場所に貼り付けるには、そこに移動して、Put します。

コマンド編集機能
p カーソルの後ろに貼り付け
P カーソルの前に貼り付け

Vim は、コピーや削除されたテキストを記憶する際に、行単位で行われたか、文字単位で行われたかも覚えています。
文字単位でコピー、削除したものは、カーソルの直前もしくは直後に貼り付けられて、行単位でコピー削除したものは、カーソル行の直前、もしくは直後に貼り付けられます。

Vim のウィンドウ分割機能

Vim は、ウィンドウを分割することが出来ます。Vim のウィンドウは、バッファと独立に存在する「覗き窓」です。
分割されたウィンドウで、同じバッファ(ファイル)を開くことも、別のバッファを開くことも出来ます。あるファイルを編集しながら、ウィンドウ分割を利用して、同じファイルの別の部分を参照することも、別のファイルを参照することも可能です。

Vim のウィンドウ関連でノーマルモードで利用できるコマンドは、すべて <c-w> から始まる2ストロークのコマンドです。

:h CTRL-W

からすべてを網羅した一覧を確認することも出来ます。

下に使用頻度の高いウィンドウ分割関連のコマンドを紹介します。

コマンド動作覚え方
<c-w>s
<c-w><c-s>
:sp (ファイル名)
:split (ファイル名)
ウィンドウの上下分割 split
<c-w>v
<c-w><c-v>
:vs (ファイル名)
:vsplit (ファイル名)
ウィンドウの左右分割 vertical
<c-w>w
<c-w><c-w>
次のウィンドウに移動する w 二回で手軽に移動
<c-w>c
<c-w><c-c>
:close
現在のウィンドウを閉じる close
<c-w>o
<c-w><c-o>
:only
:on
現在のウィンドウ以外のウィンドウを閉じる only
<c-w>h
<c-w><c-h>
ウィンドウを左に移動 カーソル移動と同じ
<c-w>j
<c-w><c-j>
ウィンドウを下に移動 カーソル移動と同じ
<c-w>k
<c-w><c-k>
ウィンドウを上に移動 カーソル移動と同じ
<c-w>l
<c-w><c-l>
ウィンドウを右に移動 カーソル移動と同じ
<c-w>x
<c-w><c-x>
現在のウィンドウと次のウィンドウを入れ替える exchange
<c-w>+
<c-w><c-+>
現在のウィンドウを1文字分高くする 高さ + 1
<c-w>-
<c-w><c-->
現在のウィンドウを1文字分低くする 高さ - 1
<c-w><
<c-w><c-<>
現在のウィンドウの横幅を1文字分狭くする 幅 <
<c-w>>
<c-w><c->>
現在のウィンドウの横幅を1文字分広くする 幅 >

ヘルプの

:h window

にウィンドウ分割の詳細な説明があります。

Vim の挿入コマンドとその取り消し、繰り返し

挿入を開始するコマンド

テキストの挿入を開始するためのコマンドはなんと6つもあります。
(他にも既存のテキストを削除してインサートモードに入る「変更(Change)コマンド」「置換(Substitute/Replace)コマンド」もあるのですが、別のところで紹介します。)
この6つはそれぞれカーソルに対しての挿入の開始箇所が違います。

コマンド挿入開始位置覚え方
i カーソルの前 insert
I カーソル行の先頭(行最初の非空白文字の前) 行全体に i
a カーソルの後ろ append
A カーソル行の末尾 行全体に a
O カーソル行の「前」に空行を挿入して、その行の先頭 Open up a new line
o カーソル行の「次」に空行を挿入して、その行の先頭 open up a new line

下に位置関係をまとめてみました。| をコマンド前のカーソル位置としたときの、i, I, a, A, O, o それぞれのコマンドの挿入開始位置を図示しています。

O
I     i|a     A
o

テキストを挿入する

各コマンドでインサートモードに入ったあと、自由にテキストを入力することが出来ます。

挿入を終了する方法

挿入を終えるときは
<ESC>, <c-[>, もしくは <c-c> でインサートモードからノーマルモードに戻ってください。 このキーは繰り返し使うことになります。自分にあったキーを選びましょう。

取り消し(アンドゥ)、取り消しの取り消し(リドゥ)、繰り返し

コマンド機能
u 取り消し(アンドゥ)
<c-r> 取り消しの取り消し(リドゥ)
. (ピリオド) 最後のコマンドの繰り返し

テキストの挿入コマンドは、インサートモードに入ってノーマルモードに戻るまでが、ひとつのコマンド操作としてカウントされます。
ですので、インサートモード一度で長文を入力してしまうと、アンドゥ一度でその長文がすべて消えてしまうことになります。まめにノーマルモードに戻って、編集の履歴を残しておくことをおすすめします。

また、いろんな場所に同じテキストを挿入したい場合は、. による最後のコマンドの繰り返しが重宝します。

Vim の移動コマンド

Vim のノーマルモードとビジュアルモードで利用できるカーソル移動コマンドをひととおり紹介します。

1文字(1行)単位の移動

Vim ではカーソルキーの代わりに、右手ホームポジションにある hjkl (←↓↑→に対応)の4つのキーを使います。

このキーバインドの起源を遡ると 1977年のADM-3a という CRT ターミナルにたどり着くのだとか…

コマンド方向内容覚え方
h 左に一文字移動 ローマ字で "h" idari
j 下に一行移動 j というアルファベットは「下」に鍵爪のようなものが伸びている
k 上に一行移動 k というアルファベットは「上」に棒が突き出ている。
l 右に一文字移動 l といっても left じゃなくて right

コマンドの前に数字を入力すると、その回数だけ移動を繰り返します。

単語単位の移動

文字単位だけでなく単語単位の移動にもなれるとより速く移動できるようになります。8種類もコマンドがありますが基本的には、 w, b, e の3種類で十分です。
下の通りSHIFTキーを押すと空白区切りの単語移動が出来るようになります。これは、プログラミング言語で、メソッド呼び出しを一気にスキップしたい時に便利です。

コマンド移動先移動方向移動前後の例覚え方
w 次の単語の先頭 This is an apple.
↓ w
This is an apple.
word
e 単語の末尾 This is an apple.
↓ e
This is an apple.
↓ e
This is an apple.
end
b 前の単語の先頭 This is an apple.
↓ b
This is an apple.
back
ge 前の単語の末尾 This is an apple.
↓ ge
This is an apple.
 
W 次の単語(空白区切)の先頭 This is an up-to-date machine.
↓ W
This is an up-to-date machine.
WORD
E 単語(空白区切)の末尾 This is an up-to-date machine.
↓ E
This is an up-to-date machine.
END
B 前の単語(空白区切)の先頭 This is an up-to-date machine.
↓ B
This is an up-to-date machine.
BACK
gE 前の単語(空白区切)の末尾 This is an up-to-date machine.
↓ gE
This is an up-to-date machine.
 

文字検索

f と t を使って、同じ行の指定文字まで移動することも出来ます。詳しくは別のページで紹介しています

行頭、行末への移動

^ と $ は、それぞれ正規表現でも先頭と末尾を示す記号なので、それを覚える手がかりにすると良いと思います。

コマンド移動先    This is a line.
0 カーソル行の先頭     This is a line.
^ カーソル行の先頭の最初の空白ではない文字     This is a line.
$ カーソル行の末尾     This is a line.

行番号を指定して移動

コマンド移動先
{数字}G 数字で指定された番号の行
gg バッファの先頭の行
G バッファの最後の行(の先頭)

段落移動

Vim は文字を含まない行(空行)で区切られた複数の行の塊を「段落(Paragraph)」とみなします。
もし編集中のテキストに、まめに空行が挿入されて段落分けがされている場合は、下の2つのコマンドで段落の間を移動すると便利です。

コマンド移動先
{ カーソル行より上方向にある最初の空行
} カーソル行より下方向にある最初の空行

文字列検索

/ もしくは ? を使って、指定文字まで移動することも出来ます。詳しくは別のページで紹介しています

画面の上端、中央、下端への移動

スクロールを発生させないように、画面位置を固定したまま、カーソルを移動させるコマンドです。あまり使うことはないかもしれません。

コマンド移動先覚え方
H 画面の上端 High
M 画面の中央 Middle
L 画面の下端 Low