今回は、Vimを使い始めて10日ほどのVim初心者が、使いながら感じたVimの魅力をお伝えしつつ基本操作をまとめたいと思います。
- はじめに
- カーソルを移動するための基本操作
- 文章を組み替えるための基本操作
- 文字の追加のための基本操作
- 文字の削除のための基本操作
- 一歩進んだ文章編集のための操作方法
- モードの使い分けについて
- プログラミングに役立つ基本操作
- その他のVimの特徴
- おわりに
はじめに
この記事の狙い
この記事は「Vimの存在は知っているけれども、どんなことが出来るのかはよく知らない」という人に向けて書いています。この記事を通してVimではこんなことが出来るんだということを知っていただき、Vimを使ってみようと思っていただけたらうれしいです。
そして自分が改めてVimを学ぶとしたらこういう順番だと覚えやすいのではないかと思う順番でまとめています。 したがって説明を省いている基本操作もありますのでご了承ください。
こんな人にこそVimを使ってほしい
今回私がVimをおすすめしたいのは次のような人です。
- タイピングが好きな人
- プログラミングや文章作成、編集の機会が多い人
- カーソルキーやHome/Endキーを押し過ぎて小指が腱鞘炎になりそうな人
タイピングが好きな人
タイピングが好きな人の中には、「タイピングは好きだけど文章を入力するのは好きではない」と思ったことがある人はいませんか? 文章を入力する作業には、面倒なことがいくつかあります。
例えば、単語を変換したり、改行をしたり、文章の構成を組み替えたりする必要があります。 これらの作業にはホームポジションから手を動かして操作することがあり、集中してタイピングすることができません。
しかしVimのキーバインドを覚えるとホームポジションから手を動かす必要がなくなり、タイピングの楽しさを損なわずに文章を入力出来るようになります。
プログラミングや文章作成、編集の機会が多い人
タイピングにそれほど情熱はないけれど、プログラミングや文章作成、編集の機会が多いという人にもVimはおすすめです。
Vimはホームポジションから手を動かさずに様々な操作をするために、コマンドを用います。 このコマンドを覚えると、普段マウスやキーボードのカーソルキーを用いて行っていた操作をすべて置き換えることが出来ます。
ホームポジションから手を動かさないことで、疲労感軽減(慣れてくると速度アップ)に繋がります。
カーソルキーやHome/Endキーを押し過ぎて小指が腱鞘炎になりそうな人
文章作成時にマウスではなくカーソルキー、それとHome/Endキーを頻繁に使う人(特に右手の小指で操作する人)にも是非Vimを使っていただきたいです。
私はこれまでカーソルキーやHome/Endといった、文章の作成時に多用するキーをすべて右手の小指で操作していました。 すると長年にわたって酷使し続けたせいか、最近右手の小指を動かすたびに痛みが走るようになってしまいました。 意識して小指を使わないようにすれば痛みも引いてくるのでまだ軽度な段階だと思いますが、恐らくこれが腱鞘炎というものなのでしょう。
このままではタイピングが億劫になってしまう・・・そんな悩みを抱えているときに出会ったのがVimでした。
Vimはカーソル移動すらホームポジションから手を動かさずにできるので、右手の小指を酷使することもなくなりました。
Vimのいいところ
Vimのいいところをまとめると次の通りです。
- 文章作成のためのコマンドが豊富
- ホームポジションから手を動かす必要がないので疲れにくい&楽しい
- 右手の小指に負担が集中しないので腱鞘炎になりにくい
Vimのコマンド操作とカーソルキー(Home/Endキー)操作の比較
Vimのコマンド操作がどういったものなのか、カーソルキー(Home/Endキー)操作と比較してみます。
手を浮かせて操作しないといけない場合に(移動)
と表記しています。
動作 | Vim | カーソルキー操作(Windows) |
---|---|---|
全体を選択 | ggVG | Ctrl+A |
カーソル位置から文書の先頭まで選択 | vgg0 | (移動) Shift + Ctrl + Home (移動) |
行末から行全体を選択 | v0 | (移動) Shift+Home (移動) |
行中から新規行を作成 | o | (移動) End , Enter (移動) |
行中の単語を変更 | f+単語の頭文字 , ciw , 入力 , (移動) Esc (移動) | (移動) カーソル , delete (移動) , 入力 |
あえて強調して書いていますが、カーソルキー操作ではほとんどの場合で手を浮かせる動作が発生しています。 それに比較し、Vimの場合は覚えるまでは大変ですが、コマンドで全ての操作が可能です。
また、Vimの特徴として、モードの切り替えという動作が必要となり、その際にEscを多用します。
通常のキー配置の場合、Escを押すタイミングで唯一手を浮かせる動作が必要になります。そのため、Escを別のキー(CapsLockなど)に割り当てることで一切手を浮かせずに操作をすることができるようになります。
※Ctrl+[でEscと同じ動作をするのでこちらを利用してもよいです。
Vimの気になるところ
Vimにもいくつか気になるところがあります。
日本語入力との相性がいまいち
Vimは英語入力で一番パフォーマンスを発揮します。 日本語入力で問題になるのは次の点です。
- モード切替とIME切替の二つの組み合わせがあり煩雑
- 文字検索の使い勝手が悪い
1つ目のモード切替とIME切替についてですが、Vimには大きく分けてノーマルモードとインサートモード、ビジュアルモードの3つのモードがあります。 インサートモード以外のモードでは、IMEoffで操作しないといけないため、モード切替をするたびにIME切替についても意識を割かないといけません。これを解決するためには設定や外部ツールの導入が必要です。
2つ目の文字検索の使い勝手についてですが、こちらもモードが関係しています。検索をするにはノーマルモードでf
キーを押すのですが、日本語の単語を検索した後ノーマルモードでまた操作をするためには次のような流れになります。
「(IMEoff) f → (IMEon) 検索ワード → (IMEoff) 次の操作」
こちらについてもプラグインなどで使いやすくしていく必要があります。
使えるようになるまでが大変
Vimは使えるようになるまでが大変だとよく言われますが、実際そうだと思います。触り始めてしばらくの間は、テキストエディタなのにモードという仕組みがあることに慣れないと思います。しかし、使っていくうちにモードとはなんと合理的な仕組みなのかと納得していくと思います。
Vimにはノーマルモードとインサートモード、ビジュアルモードの3つのモードがありますが、これはお絵描きをするときのペイントソフトで考えると雰囲気を掴みやすいと思います。ペイントソフトでは、ブラシツールだったり、消しゴムツールだったり、範囲選択ツールのように様々なツールがあります。
これがVimでいうモードのようなものです。ペイントソフトではそれぞれのツールが画面上に配置されており、それをクリックすることで、マウスだけでツールの切り替えが可能です。もし画面上にツールが配置されていなければ、マウスに加えてキーボードでショートカットを入力するといった動作が必要でしょう。
テキストエディタも同様です。キーボードに入力モードしかなければ、必要な動作を行うために専用のボタン(カーソルやHome/End)や、範囲を選択するためのマウスが必要になります。キーボードだけで全ての操作を行うために、Vimではモードという仕組みがあるのです。
ノーマルモードでは文章の整形を行い、インサートモードでは文章の入力、ビジュアルモードでは範囲の選択を行います。このように考えるとモードという仕組みが、ホームポジションから手を動かさずに操作をするために必要なものだと分かってくると思います。
楽しくて時間をかけすぎてしまうかも
Vimの操作を覚えたり設定をするのはとても楽しいので時間が溶けていきます。
まずはVimの導入や設定はCUIに慣れていないと少し時間がかかります。そして独特なVimのキーバインドと、始めて触れるモードという仕組みに慣れて、まともに文章を整形したり入力できるようになるまでに数時間ほどかかります。この時点ではコマンドはまだほとんど使えません。
だんだんモードに慣れてくると、Vim本来の能力を引き出したくなるので、コマンドを使いこなしたくなります。
そしてコマンドを覚えていきますが、似たような動作をするコマンドも多く、どういった使い方が効率的なのか知りたくなり書籍にあたります(実践Vimがおすすめです)。実践Vimを読んでVim特有の考え方を知るとコマンドが使えるようになります。
次第に標準のコマンドで物足りない部分が出てきてプラグインを探し始めます。プラグインを導入するとコマンドを拡張することが出来ます。プラグインを導入すると、更に設定ファイルを調整する必要が出てきたり、もっとプラグインが欲しくなります。フォントや背景などの見た目にも気を使ったり、他の人たちがどんなキーバインドを使ってどんなプラグインを導入しているのか調べるのが止まらなくなります。
私はこの10日ほどの間Vimのことしか考えていませんでした・・・といった感じに、Vimの操作に慣れるだけでも大変時間がかかりますし、慣れてからももっと便利に快適にと考えてしまって時間がいくらあっても足りないのではないかと思っています。
まずは文章の整形(ノーマルモード)から
では次からはVimの操作について説明していきます。Vimにはいくつかモードがありますが、まずは文章の整形をノーマルモードを用いて学んでいくのが、モードの切り替えの必要がなく良いのではないかと思います。またノーマルモードがVimで一番大事なモードだと考えており、ノーマルモードに慣れてしまえば他のモードはすぐに使えるようになると思います。
カーソルを移動するための基本操作
まずはカーソルを移動する動作です。
文章を選択し整形するためにはカーソルを移動する動作を学ぶ必要があります。カーソル移動にはhjkl
移動や文字列検索といった方法があります。
カーソル移動
hjkl移動
Vimではカーソルの移動をh
j
k
l
で行います。
キー | カーソルの動き |
---|---|
h |
左に1つ動かす |
j |
下に1つ動かす |
k |
上に1つ動かす |
l |
右に1つ動かす |
hjkl移動は一番最初に覚えましょう。 後で紹介するVim Adventuresで視覚的に覚えることができます。
{ }移動
大きく動かしたいときは{ }
移動も便利です。
キー | カーソルの動き |
---|---|
{ |
上の空行まで動かす |
} |
下の空行まで動かす |
{ }
移動を用いれば、段落単位でカーソルを大きく移動させることができます。
文字列検索
Vimではマウスを使わないため、編集したい文字列へ移動するために検索を使用します。
検索には何種類かありますが、同じ行内を検索する際はf/F
検索、別の行を検索する際は/
検索を使用します。
f/F検索
現在カーソルがある行内の文字列を検索し、カーソルを移動させます。
キー | 動作 |
---|---|
f |
カーソル位置から右方向に1文字検索し移動する |
F |
カーソル位置から左方向に1文字検索し移動する |
; |
(候補が複数ある場合)次の候補に移動する |
, |
(候補が複数ある場合)前の候補に移動する |
Vimで編集したい位置にカーソルを動かすためには、上下の行移動を{ }(段落)
とj,k(上下)
で行い、行内の移動をf
,F
キーで行う方法があります。
またvimでは大文字と小文字を異なるコマンドとして認識します。f
,F
のように、大文字と小文字で動作が逆になるコマンドなどがあります。
/検索
カーソル位置から離れた行にある文字列に移動するためには、/
検索が便利です。
キー | 動作 |
---|---|
/ |
下方向に文字列を検索し移動する |
n |
(候補が複数ある場合)次の候補に移動する |
N |
(候補が複数ある場合)前の候補に移動する |
/検索
とf/F
検索で次の候補に移動するためのキーが異なるため要注意です。
特殊な検索と移動
次は特殊な検索と移動を紹介します。
*
検索
現在カーソルがある位置の文字列で検索をすることが出来ます。
キー | 動作 |
---|---|
* |
カーソル位置の文字列で検索し移動する |
n |
(候補が複数ある場合)次の候補に移動する |
N |
(候補が複数ある場合)前の候補に移動する |
カーソル位置の文字列で検索したい場合、入力の手間が省けるので便利です。
%
移動
(
から)
、)
から(
のように対応する括弧間で移動できます。
キー | 動作 |
---|---|
% |
カーソル位置の括弧と対応する括弧に移動する |
特にプログラミングの際の括弧間の移動で便利です。
初期設定では()
,{}
,[]
などに対応していますが、設定で追加することができます。
文章を組み替えるための基本操作
ここまででカーソルの移動と文字列の検索方法について見てきました。
次は実際に文章の編集を行ってみましょう。 まずは行と行の組み替えの方法から見ていきます。
行の削除/コピーと貼り付け
dd → p
現在の行と次の行を入れ替えます。
キー | 動作 |
---|---|
dd |
現在の行を削除する(切り取る) |
p |
削除した行をカーソル位置の次の行に貼り付けする |
例
キーストローク | 変化 |
---|---|
いい天気ですね 今日は |
|
dd |
今日は |
p |
今日は いい天気ですね |
※カーソル位置を太字で表しています。
d
(delete/削除)を2回続けて押すことで、カーソルのある行を削除することができます。
その後、p
(put/貼り付け)を押すことで、削除した行をカーソル位置の次の行に貼り付けできます。
vimでは他のテキストエディタと違い、deleteコマンドで削除したワードを記憶しています。 そのためputコマンドで貼り付けすることが出来ます。
つまりvimでのdeleteコマンドは、他のテキストエディタの切り取りと同じ動作です。
yy → p
現在の行をコピーして次の行に貼り付けます。
キーストローク | 変化 |
---|---|
今日はいい天気ですね | |
yy |
今日はいい天気ですね |
p |
今日はいい天気ですね 今日はいい天気ですね |
y
(yank/コピー)を2回続けて押すことで、カーソルのある行をコピーすることができます。
その後、p
(put/貼り付け)を押すことで、コピーした行をカーソル位置の次の行に貼り付けできます。
p
キーを押す前にj,k
などでカーソルを移動すれば移動先のカーソルの次の行に貼り付けすることができます。
vimではyankがコピーを表しています。これはc
キーには既にchange/変更のコマンドが割り当てられているからです。
複数行でd/y → p
ここまでで1行単位での行の組み換えが出来るようになりました。 次は複数行での行の組み換えを見ていきます。
複数行を選択するには、V
(行選択のビジュアルモード)を使います。
キーストローク | 変化 |
---|---|
おはよう こんにちわ |
|
V |
おはよう こんにちわ |
j |
おはよう こ んにちわ |
y |
おはよう こんにちわ |
j |
おはよう こんにちわ |
p |
おはよう こんにちわ おはよう こんにちわ |
※選択中の文字は背景色で表しています
開始行にカーソルを合わせた後、V
で行選択モードに入り、j
で選択範囲の最後の行まで移動します。
最後の行まで移動したら、y
で選択範囲をコピーします。
y
を押すと自動的にビジュアルモードが解除され、ノーマルモードに戻ります。
貼り付けをしたい行まで移動し、p
を押すと次の行にコピーしていた行が挿入されます。
間違えた時はuとCtrl+r
ノーマルモードで操作を誤ってしまった時には、u
で一つ前の状態に戻すことができます。
u
で戻し過ぎてしまった場合は、Ctrl+r
でu
を取り消すことができます。
キー | 動作 |
---|---|
u |
一つ前の状態に戻す |
Ctrl+r |
元の状態に戻す(u を取り消す) |
文字の追加のための基本操作
ここまでで行単位での文章の組み換えが出来るようになりました。 次はいよいよ文章を追加するためコマンドを見ていきます。
文字の挿入
文字を挿入するためにはi
,a
などのキーでインサートモードに入ります。
i → 入力 → Esc
カーソル位置の左に文章を入力しノーマルモードに戻ります。
キー | 動作 |
---|---|
i |
カーソル位置の左からインサートモードに入る |
Esc |
インサートモードからノーマルモードに戻る |
i
はカーソルのある位置の左からインサートモードに入ることができます。
インサートモードでは通常のテキストエディタと同様に文字の入力をすることができます。
入力が終わったらEsc
キーを押すことでノーマルモードに戻ることができます。
a → 入力 → Esc
カーソル位置の右に文章を入力しノーマルモードに戻ります。
キー | 動作 |
---|---|
a |
カーソル位置の右からインサートモードに入る |
i
はカーソル位置の左から挿入しますが、a
はカーソル位置の右から挿入します。
I → 入力 → Esc
カーソル位置の行の先頭に文章を入力しノーマルモードに戻ります。
キー | 動作 |
---|---|
I |
行の先頭からインサートモードに入る |
大文字のI
は行の先頭から文章を入力することが出来ます。
A → 入力 → Esc
カーソル位置の行の末尾に文章を入力しノーマルモードに戻ります。
キー | 動作 |
---|---|
A |
行の末尾からインサートモードに入る |
大文字のA
は行の末尾から文章を入力することが出来ます。
o → 入力 → Esc
カーソル位置の次の行に新しい行を挿入し、その行に入力した後ノーマルモードに戻ります。
キー | 動作 |
---|---|
o |
現在の行の下に新しい行を挿入し、新しい行でインサートモードに入る |
o
は現在の行のすぐ下に新しい行を挿入し、新しい行でインサートモードに入ります。
カーソル位置に関わらず新しい行を作成することができます。
o
のあと入力をせずにEsc
を押すと空行を挿入することもできます。
文字の追加のための基本操作まとめ
ここまでの操作をまとめると次のようになります。
キー | 動作 |
---|---|
i |
カーソル位置の左からインサートモードに入る |
a |
カーソル位置の右からインサートモードに入る |
I |
行の先頭からインサートモードに入る |
A |
行の末尾からインサートモードに入る |
o |
現在の行の下に新しい行を挿入し、新しい行でインサートモードに入る |
Esc |
インサートモードからノーマルモードに戻る |
文字の削除のための基本操作
次は文字単位での削除の操作をみていきます。
文字の削除
x
カーソルのある位置の文字を1文字削除します。
キー | 動作 |
---|---|
x |
カーソル位置の文字を1文字削除 |
消し過ぎてしまった場合は他の操作と同様にu
で元に戻すことができます。
d$
カーソル位置から行の末尾までの文字を削除します。
キー | 動作 |
---|---|
d |
「d +範囲」で指定した範囲を削除 |
$ |
行の末尾に移動 |
d
の後に続けて「範囲」を指定することで指定された範囲を削除することができます。
$
は行の末尾に移動するコマンドで、単独で使用することも出来ます。
d$
と続けて入力することで次のような意味のコマンドになります。
何をするか:d
(削除)
範囲:$
カーソル位置から行の末尾まで
結果:カーソル位置から行の末尾までの文字を削除
d0
カーソル位置から行の先頭までの文字を削除します。
キー | 動作 |
---|---|
d |
「d +範囲」で指定した範囲を削除 |
0 |
行の先頭に移動 |
0
は行の先頭に移動するコマンドで、単独で使用することも出来ます。
d0
と続けて入力することで次のような意味のコマンドになります。
何をするか:d
(削除)
範囲:0
カーソル位置から行の先頭まで
結果:カーソル位置から行の先頭までの文字を削除
dG
カーソル位置から文章の末尾までの文字を削除します。
キー | 動作 |
---|---|
d |
「d +範囲」で指定した範囲を削除 |
G |
文章の末尾に移動 |
G
は文章の末尾に移動するコマンドで、単独で使用することも出来ます。
dG
と続けて入力することで次のような意味のコマンドになります。
何をするか:d
(削除)
範囲:G
カーソル位置から文章の末尾まで
結果:カーソル位置から文章の末尾までの文字を削除
dgg
カーソル位置から文章の先頭までの文字を削除します。
キー | 動作 |
---|---|
d |
「d +範囲」で指定した範囲を削除 |
gg |
文章の先頭に移動 |
gg
は文章の末尾に移動するコマンドで、単独で使用することも出来ます。
dgg
と続けて入力することで次のような意味のコマンドになります。
何をするか:d
(削除)
範囲:gg
カーソル位置から文章の先頭まで
結果:カーソル位置から文章の先頭までの文字を削除
文字の削除のための基本操作まとめ
キー | 動作 |
---|---|
d |
「d +範囲」で指定した範囲を削除 |
$ |
行の末尾に移動 |
0 |
行の先頭に移動 |
G |
文章の末尾に移動 |
gg |
文章の先頭に移動 |
d$ |
カーソル位置から行の末尾までの文字を削除 |
d0 |
カーソル位置から行の先頭までの文字を削除 |
dG |
カーソル位置から文章の末尾までの文字を削除 |
dgg |
カーソル位置から文章の先頭までの文字を削除 |
一歩進んだ文章編集のための操作方法
ここまでで文章編集に必要な操作をみてきました。 次はVimならではの文章編集の操作方法をみていきましょう。
単語の削除/書き換え
diw
カーソル位置の文字列(空白を含まない)を削除します。
キーストローク | 変化 |
---|---|
Hello Vim World |
|
diw |
Hello World |
※ で空白1つ分
で空白2つ分を表しています
d
(削除)の後の範囲指定にiw
を指定しています。
iw
は「inside word (もしくはinner word)」と読むことができ、カーソル位置の単語(空白を含まない)を表します。
何をするか:d
(削除)
範囲:iw
カーソル位置の単語(空白を含まない)
結果:カーソル位置の単語を削除。前後の空白は削除されないため、空白(スペース)が2つ並ぶ
iw
のポイントは範囲に空白を含まないということです。diw
で単語を削除した場合、単語の前後の空白が残り空白が2つ並ぶため不自然です。
これを踏まえて次のdaw
をみていきます。
daw
カーソル位置の文字列(空白を1つ含む)を削除します。
キーストローク | 変化 |
---|---|
Hello Vim World |
|
daw |
Hello World |
※ で空白1つ分
で空白2つ分を表しています
d
(削除)の後の範囲指定にaw
を指定しています。
aw
は「around word (もしくはa word)」と読むことができ、カーソル位置の単語(空白を1つ含む)を表します。
何をするか:d
(削除)
範囲:aw
カーソル位置の単語(空白を1つ含む)
結果:カーソル位置の単語を削除。前後の空白が1つ削除されるため、空白(スペース)が1つだけ残る
aw
のポイントは範囲に空白を1つ含むということです。daw
で単語を削除した場合、単語の前後の空白を1つ削除するため、削除後の文章はスペースが1つだけ残り自然です。
ciw → 入力 → Esc
カーソル位置の文字列(空白を含まない)を削除し、インサートモードに入ります。
キーストローク | 変化 |
---|---|
Hello Vim World | |
ciw |
Hello World |
NeoVimEsc |
Hello NeoVim World |
c
(書き換え)の後の範囲指定にiw
を指定しています。
iw
は「inside word(もしくはinner word)」と読むことができ、カーソル位置の単語(空白を含まない)を表します。
何をするか:c
(書き換え)
範囲:iw
カーソル位置の単語(空白を含まない)
結果:カーソル位置の単語を削除しインサートモードに入る。空白は削除されないため、入力した文字の前後に空白が残る
繰り返しますが、iw
のポイントは空白を含まないということです。ciw
で単語を書き換えた場合、単語の前後の空白には変化がないため、書き換え後の単語の前後にスペースが残り自然です。
caw → 入力 → Esc
カーソル位置の文字列(空白を含む)を削除し、インサートモードに入ります。
キーストローク | 変化 |
---|---|
Hello Vim World | |
caw |
Hello World |
NeoVimEsc |
Hello NeoVimWorld |
c
(書き換え)の後の範囲指定にaw
を指定しています。
aw
は「around word(もしくはa word)」と読むことができ、カーソル位置の単語(空白を1つ含む)を表します。
何をするか:c
(書き換え)
範囲:aw
カーソル位置の単語(空白を含む)
結果:カーソル位置の単語を削除しインサートモードに入る。空白が1つ削除されるため、前後の文字と入力した文字が繋がる
aw
のポイントは範囲に空白を含むということです。caw
で単語を書き換えた場合、単語の前後の空白を1つ削除するため、書き換え後の単語は前後の単語と繋がってしまい不自然です。
単語の削除/書き換えのまとめ
キー | 動作 |
---|---|
iw |
「inside (inner) word」(空白を含まずに単語を選択) 範囲を指定するためのコマンド。 iw 単独では使用できない |
aw |
「arround (a) word」(空白を1つ含んだ単語を選択) 範囲を指定するためのコマンド。 aw 単独では使用できない |
diw |
カーソル位置の単語(空白を含まない)を削除する |
daw |
カーソル位置の単語(空白を含む)を削除する |
ciw |
カーソル位置の単語(空白を含まない)を削除しインサートモードに入る |
caw |
カーソル位置の単語(空白を含む)を削除しインサートモードに入る |
ここまで見てきた通りiw
とaw
の違いは、単語の前後の空白を含むかどうかという点です。
したがって単語の削除の際にはdaw
(前後の空白を1つ削除)を用い、単語の書き換えの際にはciw
(前後の空白を削除しない)を用いると入力後の空白が自然な状態になります。
※影響があるのは英文の場合です。日本語の場合は文字の前後に空白がない場合が多いのでのでほとんど影響はありません。
括弧内/外の削除と書き換え
次は括弧内/外の削除と書き換えをみていきます。
di(
カーソル位置を囲む( )の中の文字を全て削除します。
キーストローク | 変化 |
---|---|
(Hello Vim World) | |
di( |
( ) |
d
(削除)の後の範囲指定にi(
を指定しています。i
は「inside(もしくはinner)」と読むことができるので、i(
は「( ) を含まない括弧内」を表します。i)
でも同じ意味になります。
何をするか:d
(削除)
範囲:i(
( ) を含まない括弧内
結果:カーソル位置を囲む( )の中の文字を全て削除
da(
カーソル位置を囲む( )と括弧の中の文字を全て削除します。
キーストローク | 変化 |
---|---|
(Hello Vim World) | |
da( |
d
(削除)の後の範囲指定にa(
を指定しています。
a
は「around (もしくはa , all)」と読むことができ、a(
は「( ) を含む括弧内」を表します。a)
でも同じ意味になります。
何をするか:d
(削除)
範囲:a(
( ) を含む括弧内
結果:カーソル位置を囲む( )と括弧の中の文字を全て削除
ci( → 入力 → Esc
カーソル位置を囲む( )の中の文字を全て削除しインサートモードに入ります。
キーストローク | 変化 |
---|---|
(Hello Vim World) | |
ci( |
( ) |
Neovim Esc |
(Neovim) |
c
(書き換え)の後の範囲指定にi(
を指定しています。
i
は「inside (もしくはinner)」と読むことができ、i(
は「( )を含まない括弧内」を表します。i)
でも同じ意味になります。
何をするか:c
(書き換え)
範囲:i(
( )を含まない括弧内
結果:カーソル位置を囲む( )の中の文字を全て削除しインサートモードに入ります。
ca( → 入力 → Esc
カーソル位置を囲む( )と括弧の中の文字を全て削除しインサートモードに入ります。
キーストローク | 変化 |
---|---|
(Hello Vim World) | |
ca( |
|
NeoVimEsc |
NeoVim |
c
(書き換え)の後の範囲指定にa(
を指定しています。
a
は「around (もしくはa , all)」と読むことができ、a(
は「( )を含む括弧内」を表します。a)
でも同じ意味になります。
何をするか:c
(書き換え)
範囲:a(
( )を含む括弧内
結果:カーソル位置を囲む ( )と括弧の中の文字を全て削除しインサートモードに入ります。
括弧内/外の削除と書き換えのまとめ
キー | 動作 |
---|---|
di( |
カーソル位置を囲む( )内 (括弧は含まない) を削除する |
da( |
カーソル位置を囲む( )と括弧内 (括弧を含む) を削除する |
ci( |
カーソル位置を囲む( )内 (括弧は含まない) を削除し、インサートモードに入る |
ca( |
カーソル位置を囲む( )と括弧内 (括弧を含む) を削除し、インサートモードに入る |
Vimでは簡単に括弧内の文章を削除したり、書き換えることができます。
また、( )
だけでなく、' '
や[ ]
などで囲まれている文字列もdi'
のように指定することができます。
検索文字までを削除/書き換え
ここまでで単語単位や、括弧単位での書き換えをみてきました。 次は指定した文字までを削除したり書き換える方法をみていきます。
df 検索文字
カーソル位置から検索文字(検索文字を含む)までを削除します。
キーストローク | 変化 |
---|---|
hellovim.txt | |
df. |
hellotxt |
d
(削除)の後の範囲指定にf.
を指定しています。
f
は「find (探す)」と読むことができ、カーソル移動の項目でも利用したコマンドです。f.
は同じ行内で .
を探すという意味になり、検索対象の文字(今回は.
)を範囲に含みます。
何をするか:d
(削除)
範囲:f)
同じ行内で次に出てくる.
まで(.
を含む)
結果:カーソル位置から.
まで(.
を含む)を削除
dt 検索文字
カーソル位置から検索文字(検索文字を含まない)までを削除します。
キーストローク | 変化 |
---|---|
hellovim.txt | |
dt. |
hello.txt |
d
(削除)の後の範囲指定にt.
を指定しています。
t
は「till (~まで)」と読むことができ、f
と同様に指定した文字を同じ行内から探します。f
との違いは、f
は検索対象文字を範囲に含みますが、t
は検索対象文字を範囲に含みません。
何をするか:d
(削除)
範囲:t.
同じ行内で次に出てくる.
まで(.
を含まない)
結果:カーソル位置から.
まで(.
を含まない)を削除
cf 検索文字
→ 入力 → Esc
カーソル位置から検索文字(検索文字を含む)までを削除し、インサートモードに入ります。
キーストローク | 変化 |
---|---|
hellovim.txt | |
cf. |
hellotxt |
world. | helloworld.txt |
c
(書き換え)の後の範囲指定にf.
を指定しています。
f
は「find (探す)」と読むことができ、カーソル移動の項目でも利用したコマンドです。f.
は同じ行内で.
を探すという意味になり、検索対象の文字(今回は.
)を範囲に含みます。
何をするか:c
(書き換え)
範囲:f.
同じ行内で次に出てくる.
まで(.
を含む)
結果:カーソル位置から.
まで(.
を含む)を削除し、インサートモードに入る
ct 検索文字
→ 入力 → Esc
カーソル位置から検索文字(検索文字を含まない)までを削除し、インサートモードに入ります。
キーストローク | 変化 |
---|---|
hellovim.txt | |
ct. |
hello.txt |
world | helloworld.txt |
c
(削除)の後の範囲指定にt.
を指定しています。
t
は「till (~まで)」と読むことができ、f
と同様に指定した文字を同じ行内から探します。f
との違いは、f
は検索対象文字を範囲に含みますが、t
は検索対象文字を範囲に含みません。
何をするか:c
(書き換え)
範囲:t.
同じ行内で次に出てくる.
まで(.
を含まない)
結果:カーソル位置から.
まで(.
を含まない)を削除し、インサートモードに入る
検索文字までを削除/書き換えのまとめ
キー | 動作 |
---|---|
df 検索文字 |
カーソル位置から検索文字 (検索文字を含む) までを削除する |
dt 検索文字 |
カーソル位置から検索文字 (検索文字を含まない) までを削除する |
cf 検索文字 |
カーソル位置から検索文字 (検索文字を含む) までを削除し、インサートモードに入る |
ct 検索文字 |
カーソル位置から検索文字 (検索文字を含まない) までを削除し、インサートモードに入る |
f
とt
の違いを理解し使い分けることで、柔軟な文字編集が可能になります。
日本語の文章作成時は、日本語で検索するとIMEの切り替えの手間が発生してしまうので、記号を検索文字にするなど工夫すると使いやすくなります。
モードの使い分けについて
ここまででノーマルモードでの文章整形(複数行を選択する時にはビジュアルモードも使用しました)と、ノーマルモードからインサートモードに切り替えて文章を入力する方法、それから単語を削除したり置き換える方法をみてきました。このようにVimではモードを切り替えながら文章を作成していくことになります。
今後Vimで文章を作成していくにあたって、モードの使い分けに悩むことがあると思うのでここからはモードの使いわけについてお話しします。
基本的にはノーマルモードを使う
結論から言うとノーマルモードをメインに使い、文章を入力するタイミングだけインサートモードに切り替え、視覚的に文章を選択したいときや範囲に対して特定のコマンドを実行したいときだけビジュアルモードを使用するといった使い方がおすすめです。ノーマルモードをメインで使う理由としては、u
(戻る)コマンドで戻る範囲を自分で決めることが出来るという点があげられます。
u
(元に戻す)で戻る範囲を自分で決める
特に文章の入力後の話になるのですが、文章の入力後にu
(元に戻す) で戻る範囲は「ノーマルモードからインサートモードに入り、インサートモードからノーマルモードに戻るまで」が1つの単位となります。
そのため例えば文章の改行をする際は、行の終わりで毎回ノーマルモードに戻ってo
(新しい行を作成しインサートモードに入る) を使うようにすると、入力を戻したくなった時に行単位で元に戻すことができるのでおすすめです。
もし行ごとにノーマルモードに戻らず、「インサートモードに入って1行入力、そのままインサートモードでEnterを押して改行」という使い方をした場合、複数行入力した後でu
を押すと入力した複数行がすべて消えてしまいます。
改行を例にあげましたが、このように何かの動作の区切りごとにノーマルモードに戻るようにすると、u
で戻る範囲を指定できるというメリットがありおすすめです。
インサートモードは文字入力専用モード
i
,a
,o
などで入ることができるインサートモードですが、インサートモードは「カーソル位置へ」文字入力を行うモードだと割り切って使いましょう。「カーソル位置へ」と書いたのは、インサートモードで入力中に現在のカーソル位置とは別の位置に文章を入力したくなることがあると思いますが、そういった場合は一度ノーマルモードに戻ってカーソルを動かした方がよいという意味です。
インサートモードでカーソルキーを使うことの是非
「Vimmerの前でカーソルキーを使ったら怒られた」といった話を聞いたことがあるかもしれません笑
ノーマルモードではhjkl
でカーソルを移動することができますが、インサートモードでカーソルを動かすためにはhjkl
ではなくカーソルキー(矢印キーのことです)を使わないといけません。Vimを使用していてカーソルキーを使いたくなるのはインサートモードの時だと思いますので、今回はインサートモードでカーソルキーを使うことの是非について、Vim歴は浅いですが私見を述べさせていただきます。
私はVimのメリットは「全ての操作をホームポジションから手を動かさずに行える」ことだと思っており、それを実現するためにモードやコマンドといった仕組みが備わっていると思っています。したがって、カーソルキーを操作することはVimの最大のメリットを享受できないことに加え、Vim本来の操作体系を学ぶ機会を失ってしまうことに繋がると思います。そのためカーソルキーでの操作は避けるべきだと思います。
とくに私は右手小指の痛みをなんとかしたいというモチベーションからVimを学んでいます。「すべての操作をホームポジションから手を動かさずに操作できる」という点に魅力を感じる人は、カーソルキーを触りたくなってもぐっと我慢してノーマルモードに戻ってコマンドで操作できないか考えてみてください。もし知っているコマンドで実現できなければ都度調べていくうちに、少しずつすべての操作がコマンドで出来るようになっていることが分かって楽しくなってくると思います。
ビジュアルモードは範囲を選択するモード
Vimで視覚的に範囲を選択するには、ビジュアルモードがあります。ビジュアルモードには「文字選択モード」、「行選択モード」、「矩形(長方形)選択モード」の3つがあります。
ビジュアルモード(文字選択モード)
小文字のv
で文字選択のビジュアルモードに入ることが出来ます。
このモードでは、開始時のカーソル位置からhjkl
や検索コマンドで移動した範囲を選択状態にします。
選択状態でx
(削除)やy
(コピー)といった操作が可能です。
コマンドを入力せずに選択状態を解除するにはEsc
を押します。
この操作は3つのビジュアルモードで共通となります。
また、選択範囲の開始位置を変更するには範囲選択中にo
を押します。
o
を押すたびに、選択範囲の開始位置の変更と終了位置の変更が入れ替わります。
このモードは文字単位で削除やコピーをする場合に便利です。
ビジュアルモード(行選択モード)
大文字のV
で行選択のビジュアルモードに入ることができます。
このモードでは、開始時の行から上下のjk
キーや検索コマンドで移動した行範囲を選択状態にします。
このモードは行単位で削除やコピーをする際に便利です。
ビジュアルモード(矩形選択モード)
Ctrl+v
で矩形(長方形)選択のビジュアルモードに入ることができます。
このモードでは、開始時のカーソル位置からhjkl
や検索コマンドで移動した矩形の範囲を選択状態にします。
このモードは複数範囲に同時に文字を入力したい場合などに便利です。
ビジュアルモードは「視覚的に」範囲を選択する
冒頭でビジュアルモードは視覚的に範囲を選択するモードだとお話ししました。あえて「視覚的に」とつけているのは、Vimではビジュアルモードを使用しなくても範囲を指定した操作をすることが出来るからです(一部ビジュアルモードを使わないと出来ない操作もあります)。
例えば、行の途中から行の先頭までを削除するにはd0
コマンドで実現できました。他にも、d
と/
の検索を組み合わせることで、検索した文字までの範囲を削除することができます。なので、狭い範囲を選択する場合などはビジュアルモードを使わなくても操作ができることが多いです。
ただし選択したい範囲が広くなってくると検索での指定では選択範囲を誤ってしまう可能性もあるので、そういった時にビジュアルモードを使用すると良いと思います。
ビジュアルモードのまとめ
キー | 動作 |
---|---|
v |
ビジュアルモード (文字選択モード) |
V |
ビジュアルモード (行選択モード) |
Ctrl+v |
ビジュアルモード (矩形選択モード) |
プログラミングに役立つ基本操作
ここからはプログラミングをする時に役に立つ基本操作を紹介します。
>>
,<<
でインデントの追加と削除ができる
>>
でインデントの追加、<<
でインデントの削除ができます。
キー | 動作 |
---|---|
>> |
カーソル位置の行にインデントを付ける |
<< |
カーソル位置の行のインデントを消す |
カーソルが行の途中にあってもインデントを付けたり消したりできます。 ビジュアルモードで範囲を選択した後に使用すると、複数行に対して同時にインデントの操作ができます。
( ) の中にカーソルを移動できる
( ) を入力した後、( ) 内に文字を入力することがあると思います。
通常のテキストエディタだとカーソルキーで←
を押さないといけないと思います。
Vimの場合、( ) を入力した後Esc
でノーマルモードに戻り、i
を押すと自動的に( ) 内でインサートモードになります。
これはノーマルモードに戻った時に、カーソルが)
の上に来るので、その状態でi
(カーソルの左から入力)を押すと( ) の中から入力出来るという仕組みです。
( )の中から括弧の後ろにカーソルを移動できる
( ) の中から括弧の後ろにカーソルを移動することも出来ます。 これにはいくつか方法がありますが、基本的な方法は次の通りです。
Esc
→ l
→ a
ノーマルモードに戻り、l
で)
の上にカーソルを合わせます。その状態でa
(カーソルの右から入力)を押すと、括弧の後ろから入力をすることができます。
( )の種類を変更できる
これは後から紹介するSurround というプラグインが必要になりますが、( )の種類を変更できます。
例えばcs)}
と入力することで次のようなことが可能になります。
(hello world)
→ {hello world}
その他のVimの特徴
最後にその他のVimの特徴をご紹介します。
自分でコマンドを作ることができる
Vimはこれまで見てきたようにたくさんのコマンドが予め設定されています。その上、Vimは自分でコマンドを組み合わせて新しいコマンドを設定することができます。
例えば私は行頭に移動するコマンド0
をSpace → h
、行末に移動$
をSpace → l
、カーソルを3つ分上下に移動をShift+k
とShift+j
に割り当てています。
3つ分カーソルを移動させるといったコマンドは元々存在しませんが、3j
というようにj
を3回繰り返すという表現で作成しています。
<Leader>キー
で重複しないコマンドを設定できる
コマンドを自分で設定できるとなると、既存のコマンドとの重複が気になると思います。Vimでは素晴らしい解決策が提供されています。
それが、<Leader>キー
という仕組みです。<Leader>キー
は好きなキーを設定でき、<Leader>キー
を押すことがトリガーとなり、<Laeder>キー
の次にキーを押したタイミングでコマンドを呼び出すことができます。
私が設定しているSpace → h
で行頭に移動するというコマンドも、私はSpace
を<Leader>キー
に設定しているので、Space
を押した後、h
を押すことで発動するコマンドになっています。<Leader>キー
を使うことで、既存のコマンドとの重複を避けつつ新しいコマンドを追加できるので大変便利です。
また<Leader>キー
は他のファンクションキー(ShiftやCtrl)とは違い、同時押しではなく順番にキーを押すことで発動するため、指が苦しくないという点もいいところです。
豊富なプラグインで機能を追加できる
Vimはプラグインを導入することで機能を追加することができるので拡張性が高いです。
Vimのプラグインは数えきれないくらい公開されており標準のコマンドや機能で実現できないものは大抵プラグインを探したら見つかるのではないかと思います。(最近見た記事だと200個導入している人もいました)
Surround
「( )の種類を変更」の項目でも紹介したプラグインです。文章を囲む括弧の変更や、文章に括弧を追加したり、削除することができます。
標準で搭載されていてもおかしくないような便利なコマンドなので是非導入してみてください。
Hop
カーソル移動を劇的に改善するプラグインです。
Vimはマウスを使わないで操作しますが、マウスの長所はなんといっても位置を直接指定することによるカーソル移動です。Vimはマウスを使わないのでどうしてもカーソル移動が少し苦手です。
このプラグインはマウスでのカーソル移動に遜色ないほどのカーソル移動を実現することができます。
指定したコマンド(私の場合はSpace → w
)で呼び出すと、文中の単語すべてに1文字から2文字のショートカットキーが設定され表示されます。そのショートカットキーを入力することで該当の単語にカーソル移動することができます。
繰り返しコマンドが便利
Vimは.
キーで前回行ったコマンドを再実行することができます。
例えば文章の末尾に!
を付けていく場合、次のような操作が可能です。
キーストローク | 変化 |
---|---|
hello vim world |
|
A!<Esc> |
hello! vim world |
j |
hello! vim world |
. |
hello! vim world! |
A!
の「A
(末尾に移動しインサートモードに入る) → !を入力」という操作を次の行で.
により再度実行しています。
このように複数の行に同じコマンドを実行する際などに有効に利用することができます。
おわりに
ここまで読んでいただきありがとうございました。こんなに長くなるとは思わなかったですが、現時点で書きたいことは一通り書くことができました。
私のようにタイピングは好きだけど指の痛みで悩んでいるような方や、もっと楽しく文章編集をしたいという方がVimを使ってみるきっかけになれば嬉しいです。
Vimの操作は慣れるまで結構大変 (特にモードの切り替え) なので、使い始めることが億劫かもしれませんが、今回紹介した基本操作を覚えることで最低限の文章編集が可能になるはずです。その上でやりたい操作について都度調べていくと出来ることが増えていって楽しいと思います。
インストールやプラグインの導入、その他の基本操作については調べていただくと他にたくさんVimの紹介記事がありますので、そちらも参照してみてください。
使用した教材
最後に私がVimを学習する際に使用した教材を紹介します。