しぐまろぐ

勉強したことや読んだ本について書きます。

vimtutorの内容を元にvimの基本操作についてまとめてみた

はじめに

vimはエディターの一種です。マウスがなくても使用できるため、サーバを操作するときによく使用されています。多様なコマンドを使いこなせるととても便利なため、普段使いしているプログラマも多くいます。
しかし、そのコマンドの多さから初心者が使いこなすには少しハードルがあります。
そのハードルを超える手助けのため、vimには公式のチュートリアルが存在します。それが「vimtutor」です。Linuxで「$ vimtutor」と入力すれば簡単に始めることができます。
この記事では、vim初心者の方と記憶力が衰えつつある自分のために、vimtutorの内容を整理してまとめるものです。
なお、本記事は練習も兼ねてvimで書きました(VScodevim拡張機能を入れました)。

カーソル移動

カーソル移動は位置キーでも行えますが、位置キーがないキーボードもありますし、ホームポジションから指を移すことなく移動できた方が早いです。基本的にはh,j,k,lを使ってしましょう。

キー 移動方向
h
j
k
l

覚え方

h, l はキーボード上の左右と一致しているので覚えやすいですよね。ただ、問題は j, k です。これは実はJK(女子高生)のイントネーションと同じと考えると覚えやすいです。J↓K↑です。

ファイル内の移動

h, j, k, lで一応移動はできるのですが、何行にも及ぶファイルの場合は疲れてしまいますよね。そんなときに便利なコマンドを紹介します。

コマンド 説明
0 行頭へ移動
$ 行末へ移動
w 単語の末尾へ移動
gg ファイルの先頭へ移動
nG , :n ファイルのn行目へ移動
G ファイルの末尾へ移動
H 画面の最上行へ移動
L 画面の最下行へ移動
ctrl + b 前の画面へ移動
ctrl + f 次の画面へ移動

現在のファイルの行数は、Ctrl + gを押すと下側に表示されます。

ファイルの行数表示

モード

vimは入力と操作をキーボードだけで行いますので、「今入力されたhはカーソルを左に移動させるということなのか?それともhという文字を入力したいのか?」をvimに区別してもらうために、モードの切替を行います。
モードには以下の3種類があります。

モード 説明
Normal ファイル内の操作を行う
Insert ファイル内での入力を行う
Visual ファイル内での文字の選択を行う

このうちVisualモードについては後述することにして、この章ではNormalモードとInsertモードについて扱います。
vimを開いた時点ではNormalモードになっています。Normalモードでは先程紹介したカーソル移動や、後述する文字の編集・削除、ファイル内の検索、vimの起動終了などあらゆることを操作します。名前の通り、ノーマルな(通常の)操作はこのモードで行い、文字を入力したいときにInsertモードに切り替えます。切替は以下のコマンドで行えます。

コマンド 説明
i カーソル位置から入力
a カーソル位置の後ろから入力
I 行頭に移動してそこから入力
A 行末に移動してそこから入力
O カーソル位置の上に新しい行を作成し、行頭から入力
o カーソル位置の下に新しい行を作成し、行頭から入力

切替は必ず英数字入力モードに変更してから行ってください。日本語入力モードでiやaを押してもNormalモードに変更されません。

InsertモードからNormalモードに戻すには、Escキーを使います。モードは画面の左下に表示されます。

モードの表示

覚え方

iはinsert, aはappendの頭文字と考えると、入力した文字の挿入位置が前か後ろかわかりやすいと思います。それらを大文字にしたA, Iも前後は同じなので一緒に覚えられると思います。
問題はOとoですね。正直これはもう理屈ではないので、vimを繰り返し触っていく中で指に覚えさせるしかないです。vimの操作全般にいえることなんですけどね。

vimの起動、保存、終了

vimエディタでファイルを編集するには、ターミナルで以下のコマンドを実行します。

$ vim {ファイル名}

するとvimエディタが立ち上がってファイルの編集ができるようになります。
編集後に保存・終了を行うには、まず、Normalモードで「:」を押します。すると、画面最下部にカーソルが移動するので、そこで以下のコマンドを入力してENTERキーを押します。

コマンド 説明
:w 保存
:q 終了
:q! 保存されていない内容を破棄して強制的に終了
:wq | :x ZZ | 保存して終了
:wq! 強制的に保存して終了
:e [ファイル名] vimを終了せずに現在のファイルを閉じて他のファイルを開く(現在のファイルが編集済みの場合は警告が表示され他のファイルは開けない)
:e! [ファイル名] vimを終了せずに現在のファイルを閉じて他のファイルを開く(現在のファイルが編集済みの場合、最後に保存した状態に戻す)。ファイル名を指定しない場合は、単に現在のファイルを最後に保存した状態に戻す

編集終了

覚え方

wはwrite, qはquitだと考えると覚えやすいです。「やれ!」という感じで強制的にやらせる場合に!を付けます。

テキストの削除

削除は大きく分けて2種類のコマンドで実行できます。xとdです。xコマンドは1文字単位で削除を実行し、dコマンドは単語・行・カーソル位置から行末までなど色々な削除の仕方ができます。
まずは具体例を見ていきます。

例)This is a pen.という文章を対象に削除コマンドを試してみます。

  • Tにカーソルがある状態で「x」を押すと、Tが削除される
  • Tにカーソルがある状態で「3x」を押すと、Thiの3文字が削除される
  • Tにカーソルがある状態で「3dw」を押すと、"This is a "の3単語が削除され、カーソルはpに当たる
  • Tにカーソルがある状態で「3de」を押すと、"This is a"の3単語が削除され、カーソルはpの前の空白に当たる
  • aにカーソルがある状態で「d0」を押すと、aより前が全て削除される
  • aにカーソルがある状態で「d$」を押すと、aより後が全て削除される
  • 文章のどこかにカーソルがある状態で「dd」を押すと、行全体が削除される

規則性が見えてきたでしょうか?
実は上記の例では、コマンドと「モーション」を組み合わせて削除を実行しています。モーションは、何に対して働きかけるかを表しています。

モーション 説明
w カーソル位置から次の単語の直前まで
e カーソル位置からその単語の末尾まで
0 カーソル位置から行頭まで
$ カーソル位置から行末まで

コマンドは数字とも組み合わせられます。上記の例で挙げた「3dw」の場合は、カーソル位置から3つの単語とその次の単語の直前の空白まで削除され、「3de」の場合は、カーソル位置から3つの単語の末尾までが削除されるというわけです。

覚え方

まず、削除のコマンドであるdはdeleteの頭文字です。
モーションのwは「次のwordの直前まで」、eは「その単語のendまで」で覚えられますよね(ちょっと無理やりですが)。 0は0文字目、$はドルマークなので「終わっとる(ドル)」で終わりの文字だと語呂合わせで覚えましょう!!!

テキストの貼り付け

削除したテキストはpコマンドで貼り付けることができます。

コマンド 説明
P カーソル位置の左側もしくは上の行に貼り付け
p カーソル位置の右側もしくは下の行に貼り付け

また、yコマンドでテキストを削除せずにコピーすることができます。yコマンドでコピーしたテキストもpコマンドで貼り付けられます。
コピー、貼り付けのvimコマンドをWindowsのショートカットキーと対応させると、以下の通りです。

vimのコマンド Windowsショートカットキー 操作
y ctrl + c コピー(コピーしたテキストは削除しない)
d ctrl + x コピー(コピーしたテキストは削除する)
p ctrl + v 貼り付け

貼り付けも削除と同じくモーションと組み合わせて使用できます。

コマンド 説明
yw 単語のコピー
yy もしくは Y 行全体をコピー
nyy n行をコピー
y0 カーソル位置から行頭までコピー
y$ カーソル位置から行末までコピー

覚え方

貼り付けのpはpasteの頭文字です。よくコピペっていいますよね、あれの"ぺ"にあたるペーストのことです。Pとpの違いは、大文字なら上(左)、小文字なら下(右)と覚えるしかないです。(前述したOとoも同じです)
yはyank(ヤンク)の頭文字です。ペーストに比べるとなじみがない英単語ですね。「引っ張る」という意味らしいので、テキストを引っ張ってくるイメージでしょうか。

Visualモード

モードの章で飛ばしたVisualモードについて解説します。Visualモードでは文字列の範囲選択ができ、選択した範囲に対して何か操作を行います。
例えば、複数行をコピーする場合は、コピーしたい行の先頭で「v」を押してVisualモードに切り替えます。そのままカーソルを移動させ、コピーしたい行が全て選択状態になったら、「y」を押してコピーします。

Visualモードで選択
あとは、貼り付けたい場所に移動して「p」を押せば貼り付けられます。

置き換え

置き換えコマンドを使えばいちいちモードを切り替えて削除を入力を実行しなくて良く、楽です。
置き換えたい文字にカーソルが当たった状態で、1文字だけを置き換えるならr, 1文字以上を置き換えるならRを押すと置き換えを実行できます。

例)This is a pen.のpにカーソルが当たった状態でRを押すと置き換えできるようになります。入力が終わったら「Esc」を押してNormalモードに戻します。

覚え方

rはreplaceの頭文字です。

単語や行の変更

cコマンドとモーションを組み合わせると、単語や行の変更を行えます。
例えば、「cw」ならカーソル位置から単語の終わりまでを削除してInsertモードに切り替える、「c$」ならカーソル位置から行末までを削除してInsertモードに切り替えるといったことができます。
削除コマンドで同じようなことができるので覚えなくてもいいかなと思っています。

操作の取り消し

誤ってコマンドを実行してしまったときに取り消すのがuコマンドです。そして、uコマンドで取り消した操作を再実行するのがctrl + rです。
Windowsショートカットキーとの対応は以下の通りです。

vimのコマンド Windowsショートカットキー 操作
u ctrl + z 操作の取り消し
ctrl + r ctrl + y 取り消した操作の再実行

Windowsショートカットキーにはない操作ですが、vimでは「U」を押すと行全体の操作を取り消して元の状態に戻すことができます。

覚え方

uはundo(アンドゥ)の頭文字です。unは否定の接頭辞なので「doしない」ということですね。(do自体に「する」という意味があるので、「doしない」という言い方はおかしいのですが、イメージしやすいのであえてこの言い方をしています)
rはredoの頭文字です。reは繰り返しを表す接頭辞なので「再びdoする」ですね。rやRは既にコマンドとして使われているのでctrlキーと同時押しなのだと思います。

ファイル内の検索

Windowsでctrl + fで検索が行えるように、vimでもファイル内の検索が行えます。
/を入力すると、画面の下側に入力欄が現れるので、検索したい単語を入力します。ここでは例としてbashrcと入力しました。

bashrcで検索
ENTERキーを押すと、カーソル位置から一番近い検索結果へ移動します。
上方向の検索結果に移動するにはN, 下方向に移動するにはnを入力します。

コマンド 説明
? 上方向に検索を実行
/ 下方向に検索を実行
N カーソル位置より上の検索結果に移動
n カーソル位置より下の検索結果へ移動

検索したい単語に?や/が含まれる場合は、\を使ってエスケープしてください。
例えば、「/\/home」と入力すると「/home」が検索できます。

対応する括弧の検索

カーソルが括弧に当たった状態で「%」を押すと、その括弧に対応する括弧までカーソルが移動してくれます。
この機能はデバッグのときに対応を見つけてくれて便利です。例えば以下の場合、1行目の括弧で「%」を押すとカーソルが移動しないので、対応する括弧がないことがわかります。

class Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}

括弧は(, [, {のいずれでも、そして括弧が何重になっていても大丈夫です。

ファイル内の一括置換

置き換えについては前述しましたが、検索して一括置換する場合は、他に便利なコマンドがあります。
まず、ある行で文字列の一括置換を行いたいときのコマンドを見てみます。その行にカーソルを当てた状態で、以下のコマンドを入力します。

:s/{置換元文字列}/{置換後文字列}/g

最後のスラッシュの後に「g」があると、検索結果の置換元文字列を全て置き換えてくれます。「g」がなければ置換は1回だけです。また、「gc」とすると、検索結果を置き換えるかどうか確認を取りながら置き換えが行えます。
他にも、特定の範囲だけ置き換えたり、ファイル全体で置き換えをすることができます。

コマンド 説明
:s/{置換元文字列}/{置換後文字列}/g カーソル位置の行を対象に一括置換
:#,#s/{置換元文字列}/{置換後文字列}/g #行目から#行目までを対象に一括置換
:%s/{置換元文字列}/{置換後文字列}/g ファイル全体を対象に一括置換
:%s/{置換元文字列}/{置換後文字列}/gc ファイル全体の検索結果に対し、1つずつ確認を取りながら置換

外部コマンドの実行

vimエディタを使用中にvimから抜け出すことなく外部コマンドを実行することができます。
外部コマンドを実行するには、「:」を押して画面最下部にカーソルを移動させた後、「!」を押します。これらに続けて実行したいコマンドを入力し、ENTERキーを押すだけです。
例としてlsコマンドを実行してみましょう。

:! ls

実行結果が表示されたら、ENTERキーを押して結果の表示を終了できます。

外部ファイルへの書き込み

現在vimエディタで編集しているファイルを外部ファイルに書き込むには、以下を実行します。

:w {外部ファイル名}

例えば「:w test.txt」と入力すれば、現在編集しているファイルの内容がtest.txtへ書き込まれます。

選択範囲の外部ファイルへの書き込み

ファイル全体ではなく、選択した範囲のみを外部ファイルへ書き込むには、Visualモードを使用します。
まず、「v」を押してVisualモードへ切り替えて、外部ファイルへ書き込みたい部分を選択します。
その後、「:」を押すと、画面の最下部に「:'<,'>」が現れます。その後ろに「w {外部ファイル名}」を指定します。

選択範囲を外部ファイルへ書き込み

覚え方

他のファイルへの書き込みなので、writeの頭文字のwです。

外部ファイルの読み込み・書き出し

前の2章とは逆に、外部ファイルを読み込んで、現在編集中のファイルのカーソル行の下へ書き出すこともできます。

:r {外部ファイル名}

外部コマンドの実行結果を書き出すこともできます。例えば、lsコマンドの実行結果を書き出す場合のコマンドは以下の通りです。

:r !ls

覚え方

他のファイルを読み込むので、readの頭文字のrです。

オプション機能

vimエディタには便利なオプション機能が存在します。デフォルトでは無効になっているので、使用したい場合は設定が必要です。
オプション機能を設定するコマンドは以下の通りです。

コマンド 説明
:set {オプション名} オプションを設定する
:set no{オプション名} オプションの設定を解除する

オプションには以下があります。

オプション 説明
ic 検索時に大文字・小文字の違いを区別しない
nuber ファイルの行番号を表示
hlsearch 検索結果をハイライト表示

例えば、「:set hlsearch」と設定した後で「/ignore」と検索すると検索結果がハイライト表示されます。

検索結果のハイライト表示
ハイライト表示を解除したい場合は、「:set nohlsearch」とします。

覚え方

icはIgnore Caseの, hlsearchのhlは、highlightの頭文字です。

helpサイト

vimのヘルプを参照するには、vimエディタを起動した状態で「:help」を押します。すると、現在編集中のファイルのウィンドウとは別に、ヘルプウィンドウが立ち上がります。
ヘルプウィンドウへ切り替えるには、ctrl + wを押します。ヘルプウィンドウ内で検索を実行することもできます。
ヘルプウィンドウを閉じるには、「:q」と入力してENTERキーを押します。

参考