Linux管理者おすすめ: viエディタの最小限コマンド

新入社員やUnix/Linux未経験がviで苦戦するのをよく見ます。
ネットではコマンドの説明を主とした内容が多く、このような資料を見てviを使うと、モードの違いが分からず、思ったように編集できないことが多いです。また、覚えることが多いなぁ…どこまで覚えればいいのだろう?といった不安を抱くこともあります。
ここでは、viの前提となる考えや、必要最小限の操作を行うためのviコマンドの説明、覚え方のコツを説明します。

前提となる考え

  • viはマウスを使わない前提で作られている。
    viの歴史はとても古くマウスがない環境でファイルを編集する前提で作られています。
    Windowsであれば、マウスを使って上下左右にカーソルを移動して編集し、メニューからファイル保存、等のようにマウス前提になっています。viの場合、このようなマウスで行うことをキーボードで全てやる必要があります。このような背景から、viでは次の「モード」という考えがあります。
  • 「コマンドモード」と「編集モード」
    コマンドモードでカーソル移動や行追加、削除等を行い、文字入力したい場合へ編集モードに切り替えます。編集モードになると、キー入力はコマンドとは見なされず、通常の文字入力になります。
    初心者がvi操作でつまずく所で、注意が必要です。
  • システム管理を目的とするなら覚えることは少ない。
    Unix/Linux上でファイル編集する場面としては、プログラミングや文書作成で複雑な操作を行う場合、システム管理のための設定ファイルの編集やログの確認程度の簡単な作業を行う場合が想定されます。
    前者の場合はviを使う必要性はありません(*1)。後者の場合、ファイルを開いて設定箇所を検索したりカーソル移動して編集し、ファイル保存する程度で、求められる操作は限定的です。
  • 操作を覚えるとWindows時より編集速度が上がります。
    最低限のコマンドを覚えられれば、マウスを使う操作が激減するので、キーボードでほとんど操作できるようになり、作業効率が上がります。

*1: 例えばプログラミングの場合では編集する行数が膨大になります。作業の負荷軽減や効率向上ためにより多くのコマンドを覚える必要がありますが、今時はそのような作業を支援するツール(eclipse等)が用意されることが多いので、あえてviを使う必要はありません。

操作方法

  • 覚えるコツは、「モードが2つあることの理解」「コマンドの意味(単語)とルールの理解」と思います。
  • 現在の状態が「コマンドモード」なのか「編集モード」なのかを意識しましょう。
  • ファイル内でのカールの自由な移動、検索による移動、編集と保存ができることを踏まえて、紹介するコマンドを限定しています。
  • コマンドが意味している英単語を理解できると覚えやすいと思います。コマンドを繰り返す場合はコマンド前に数字を入力、小文字/大文字で方向や意味が反転、等のルールを理解すると、コマンドを覚える手助けになります。
  • カーソル移動のhjklは頻繁に使うためか、ブラインドタッチの右手で押しやすいキーに集まっています。これは、理解するというよりは、体で覚えるレベルです…慣れるまで矢印キーでも良いと思います。(*1)
  • 何か困ったり不安になったらESCを連打してください、コマンドモードに戻せます。意図しない編集がされてそうな場合は、後述の:q!で保存せずに終了してください。
  • Ctrl+zでviを終了しないでください。実際には終了せずにメモリ上に残っているため。(*2)
  • 下記コマンドを中心に研究や仕事を約25年間やってこれているので、この辺りが最小限と考えています。より難しいことをやりたいのであれば、その都度ネット等で調べて覚えて頂ければ十分かと。

※編集モードになるコマンドは青字、終了時にESCキーを押す必要がある。

分類キー意味(*3)説明
カーソル移動h(←)
j(↓)
k(↑)
l(→)
左下上右移動、今後もviを良く使うなら作業効率化のためにhjklを覚えてほしいが、難しければ矢印キーで大丈夫。
0, $行頭に移動は0(ゼロ)、行末に移動は$
Ctrl+u
Ctrl+d
page up
page down
上方向、下方向にページ移動
GGoto行番号に移動(先頭行: 1G、10行目: 10G、最終行: 0G, G)
設定ファイルのエラーで行番号が指定された場合、その行を特定するためによく使う。
検索/xxxカーソル位置からxxx(正規表現)を検索
(正規表現が分からない人は記号を含めない検索が無難)
nnext次の該当箇所を検索(Nで逆方向に検索)
編集iinsert(挿入)カーソル文字の前から入力
aappend(追記)カーソル文字の後から入力
oopen下に空行を挿入して入力(Oは上に挿入)
x1文字削除(10xで10文字削除)
uundo(やり直し)直前の操作の取り消し、やり直しできる回数は環境依存
コピペyyyank(引っ張る)1行コピー(10yyで10行コピー)
dddelete1行削除(10ddで10行削除)
ppaste(貼り付け)yy, ppの内容を貼り付け。設定ファイル編集で既存設定行を複製して設定値を定義する際にyypという入力を多用。
ファイル操作:wqwrite/quit保存して終了(ZZでも可)
:q!quit(強制)変更を無視して終了

*1: 昔は矢印キーを入力すると環境によっては意図しない制御文字が入ってしまったりとかで使えないことが多かったのですが、今時はそういうことはほとんどないので矢印キーでも大丈夫かと思います。マウスのホイールは、ターミナルの履歴をスクロールしているのかvi上のファイル内容をスクロールしているのか、一見分からない場合があるので、使用しない方が良いと思います。
*2: 見た目は終了しているように見えますが、Ctrl+zはバックグラウンド実行を意味しておりユーザの知らない所で実行されています(プロセスが残る、ゾンビプロセスと表現される)。このような場合、コマンドラインからfgコマンドで実行を戻すか、killコマンドでviを強制終了します。
*3: 覚えるために私が勝手に決めた内容であり、公式なものではないことにご注意ください。