viはターミナル画面でテキストファイルを編集するエディタです。サーバーに接続してファイルを開いたのに文字が入力できなかったり、終了しようと押したキーが本文に入力されてしまったりする場合、まずは今、文字を入力している状態なのか、コマンドを実行している状態なのかを区別することが重要です。
最初からすべてのコマンドを覚える必要はありません。新しい実習ファイルを一つ開き、iで入力し、Escで入力を終え、:wqで保存して終了すれば、最初の作業は完了です。この記事では、その5分間の実習から始めて、移動、行編集、検索と置換へと範囲を広げていきます。
viというコマンドが実際にはVim(Vi IMproved)を実行する環境も多くあります。しかし、すべてのviがVimであるわけではありません。以下の主要コマンドはPOSIX vi/exの仕様を基準に選び、実行確認はmacOSのVim 9.1で行いました。画面表示や一部の詳細な動作は、実装や設定によって異なる場合があります。POSIX vi仕様、Vim公式入門

まず5分: ファイルを作成し、保存してから再度開く
実習にはviとmktempがインストールされたシェルが必要です。以下のテンポラリディレクトリ作成方法はLinuxとmacOSでよく使われますが、mktemp自体をPOSIX viの機能と見なすものではありません。既存の設定ファイルや運用ファイルではなく、新しいテキストファイルのみを使用します。
シェルはviを実行する前と終了した後にコマンドを入力するターミナル状態です。まずシェルで次の2行を実行します。最初の行が失敗した場合、2行目には進みません。
vi_lab_dir=$(mktemp -d)
vi "$vi_lab_dir/practice.txt"
vi_lab_dirは今回の実習用テンポラリディレクトリを記憶するシェル変数です。同じターミナルで継続して使用します。空白画面の下にある~はファイルに含まれるチルダではなく、まだテキストがない画面領域を示します。
1. iで入力し、Escで入力を終える
viを初めて開くと、通常はコマンド状態です。ここで小文字のiを一度押すと入力状態に変わります。次の3行を直接入力し、最後のgreenの後でEscを押します。行間ではEnterを押しますが、最後の行の後には追加のEnterを押さないでください。
apple red
banana yellow
apple green
このとき、iとEscはファイルに書き込む文字ではなく、押すキーです。特に以下の説明でEsc → :w → Enterのように書かれた順序は、矢印まで入力するという意味ではありません。
入力状態では文字キーが本文に入力されます。コマンド状態では同じキーが移動や編集を実行します。状態が分からなくなったら、Escを押してコマンド状態に戻ってから次の動作を開始します。Vimで表示される– INSERT –のような案内は、すべてのviで同じように表示されるわけではありません。入力とコマンド状態の説明

図:公式ドキュメントを基に再構成。Vim入力状態と保存・終了。
2. :wで保存し、:qで終了する
Escを押した状態で:wを入力し、Enterを押します。
:w
コロン:を押すと、画面の下でコマンドを記述するコロンコマンド入力状態に入ります。ここではEnterを押して初めてコマンドが実行されます。:wは現在の編集内容をファイルに保存し、エディタは開いたままにします。保存エラーが出た場合、保存されたとは見なしません。
保存に成功したら、続けて:qとEnterを押します。
:q
シェルに戻ったら、ファイルを読んでみます。これはvi内で入力するコマンドではありません。
cat "$vi_lab_dir/practice.txt"
最初に入力した3行がそのまま出力されれば、入力と保存が確認できたことになります。この実習のようにファイルを一つ編集する場合、:qは終了コマンドであり、保存されていない変更がある場合は通常、終了を拒否します。Vim保存・終了の説明
3. 再度開いて一文字追加し、:wqで終了する
シェルで同じファイルを再度開きます。
vi "$vi_lab_dir/practice.txt"
コマンド状態で次のキーを順番に押します。
G → $ → a → ! → Esc → :wq → Enter
Gはファイルの最終行へ、$は現在の行の最終文字へ移動します。aは現在の文字の後ろから入力を開始するため、!がgreenの後ろに付きます。Escで入力を終えた後、:wqを実行すると保存して終了します。再度catで確認したとき、最終行はapple green!であるべきです。
4. :q!で保存されていない変更のみを破棄してみる
ファイルを再度開き、Gを押します。続けて小文字のoを押して現在の行の下に新しい行を作成し、temporary noteを入力した後、Escを押します。今回は:qを実行してみます。保存されていない変更があるため、終了を拒否する案内が表示されることがあります。
この追加行を破棄することにした場合、Escを押した後、以下のコマンドとEnterを入力します。
:q!
:q!は最後の保存以降の変更を保存せずに終了するコマンドです。ファイル削除コマンドではありません。シェルでcatで読むと、前に保存した3行とgreen!は残っており、保存されていないtemporary noteだけがありません。まだ一度も保存していない新しいファイルで:q!で終了した場合、新しい内容がファイルとして作成されないことがあります。終了と変更破棄の説明
入力位置と移動: 必要な場所へ移動して修正する
同じファイルを再度開くと、次の実習を続けることができます。最初は行の先頭にカーソルを置き、iとaの違いを比較すると簡単です。
0を押すと現在の行の最初の文字に移動します。ここでiを押し、Note: を入力した後Escを押すと、Note: apple redのようにカーソルがあった文字の前にテキストが挿入されます。一方、$で行末に移動した後aで入力すると、最後の文字の後ろに挿入されます。oは現在の行の下に新しい行を作成し、すぐに文字入力を開始します。
位置移動と編集はコマンド状態で行います。h、j、k、lはそれぞれ左、下、上、右です。入力状態でjを押すと下に移動する代わりに文字jが入力される可能性があるため、まずEscを押します。
複数の文字をスキップするときはwとbが便利です。wは次の単語の先頭へ、bは前の単語の先頭へ移動します。単語の途中でbを押すと、まず現在の単語の先頭に戻ります。単語の境界には空白だけでなく記号も影響するため、最初はapple redのような単純なテキストで練習します。
ファイルの最終行はG、最初の行は1Gで移動できます。0は数字のゼロ、oは小文字のアルファベットのオーです。これらは異なるコマンドです。Vim基本移動
行削除・コピー・貼り付け: pは何をどこに入れるのか?
前の入力実験を保存する必要がなければ、:q!で終了した後、同じファイルを再度開きます。以下の実習は保存された3行を基準に進めます。
まず1Gで最初の行に移動し、yyを押します。これは小文字のyを2回押す動作で、現在の行全体をコピーします。続けて小文字のpを押すと次のようになります。
apple red
apple red
banana yellow
apple green!
yyでコピーしたものは行単位のテキストです。したがって、pはカーソルがあった行の下に新しい行として挿入します。現在の文字のすぐ後ろに文字列を連結する動作とは異なります。文字単位でコピーした内容をpで挿入するときは現在の文字の後ろに入りますが、今回のyyの実習は行単位です。POSIX行単位貼り付け、Vimコピー・貼り付け
コピーした内容はレジスタ、つまりvi内部でテキストを記憶する空間に入ります。名前を指定しないこの実習のpは、基本的に名前のないレジスタの内容を使用します。ターミナルやオペレーティングシステムのクリップボードの内容を自動的に貼り付けるコマンドと考えると混同しやすいです。
次にddを押して現在の行を一つ削除し、すぐにuを一度押してその削除を取り消します。ddも削除した行をレジスタに格納します。したがって、yyの後にddを実行した場合、次のpに挿入される内容が変わる可能性があります。最初はコピー後すぐに貼り付け、削除後すぐに元に戻すで練習すると結果を確認しやすいです。
削除した行を移動する実習も可能です。元の3行で最初の行にカーソルを置きddを押すと、banana yellowが最初の行に上がってきます。その状態でpを押すと、削除したapple redが現在カーソルがあるbananaの行の下に挿入されます。削除前の位置を基準に挿入されるわけではありません。
uの実行取り消し履歴は実装によって違いがあります。ここでは直前の変更を一度だけ元に戻す動作のみを習得します。Vimの複数段階の実行取り消しやCtrl-rでの再実行をすべてのviで同じと仮定しません。Vimとviの実行取り消しの違い
検索と置換: まず探し、範囲を絞って変更する
検索はコマンド状態で/appleを入力し、Enterを押します。
/apple
現在のカーソル位置の後方で一致する位置を探します。小文字のnは直前の検索と同じ方向で、大文字のNは反対方向で次の一致項目を探します。検索がファイルの末尾から先頭に続くかどうかは設定によって異なる場合があります。/検索の後には通常nが前方へ、Nが後方へ探します。Vim検索の説明
置換は画面でテキストを探すことに加えて、実際の編集内容を変更します。次の例は、デフォルト設定でappleをorangeに置き換えます。各行は範囲を比較する独立した例であり、上からすべて連続して実行するという順序ではありません。
WRIMO-MD-TABLE-0]%はファイル全体の行範囲、末尾のgは該当行内のすべての一致を意味します。gだけを付けたからといってファイル全体を置き換えるわけではありません。例えば、現在の行がapple appleであるとき、:s/apple/orange/の結果はorange apple、:s/apple/orange/gの結果はorange orangeです。Vim置換と範囲
最初は/appleで位置を確認し、現在の行だけを置換してみます。結果が正しければ、必要な行範囲に広げます。:%s/…/…/gは、異なる文脈の同じ単語まで一度に置き換えることができます。
検索部分は正規表現というパターン規則で解釈されます。特に.のような記号は文字通りではなく異なる意味を持つことがあり、置換内容の&も特別な意味があります。この記事の単純な英単語の例を任意のパスや複雑な文字列にそのまま適用しないでください。置換直後に間違った結果を発見した場合は、Escの後にuで直前の変更を取り消して確認します。:wで保存した変更は、後で:q!を実行しても自動的に取り消されません。
実習後に見る最小参考表
以下の表で、移動・編集キーはEscを押したコマンド状態で使用します。コロンコマンドと検索は最後にEnterが必要です。大文字と小文字を区別します。
| 目的 | キーまたはコマンド | 記憶する点 |
| コマンド状態に戻る | Esc | 入力を終了し、次のコマンドを開始 |
| 入力開始 | i / a / o | 文字の前 / 文字の後ろ / 現在の行の下に新しい行 |
| 保存・終了 | :w / :q / :wq | 保存 / 終了 / 保存して終了 |
| 変更を破棄して終了 | :q! | 最後の保存以降の変更を破棄 |
| 一文字移動 | h / j / k / l | 左 / 下 / 上 / 右 |
| 行・単語移動 | 0 / $ / w / b | 行の最初の文字 / 最後の文字 / 次・前の単語の先頭へ |
| ファイルの末尾・先頭 | G / 1G | 最終行 / 最初の行 |
| 行削除・コピー・貼り付け | dd / yy / p | 行単位の内容は現在の行の下に貼り付け |
| 直前の変更を取り消す | u | この記事は一度の取り消しのみを前提 |
| 検索・次の結果 | /単語 / n / N | 検索 / 同じ方向 / 反対方向 |
Vimのgg、Visual選択モード、Ctrl-r、:syntax、vimtutorは、この記事のvi共通実習には含まれていません。実際の実行プログラムがVimであることを確認した後、別途習得することができます。
実習を終えたら、:wqまたは:q!でviを終了します。ファイルが不要になった場合は、同じシェルで次のように今回作成したファイルと空のディレクトリのみを整理します。rmdirはディレクトリに他のファイルがある場合、削除を拒否します。
rm "$vi_lab_dir/practice.txt"
rmdir "$vi_lab_dir"
実行確認範囲と出典
2026年10月9日、macOS arm64の/usr/bin/vi、Vim 9.1(パッチ1~1752)で、ユーザー設定・履歴・スワップファイルを使用しない互換モードで一時テキストファイルを開いて検証しました。入力、保存・終了、未保存状態での:q拒否と:q!後のファイル保存、移動、行コピー・削除・貼り付け、一度の実行取り消し、検索方向、置換範囲と結果を確認しました。
この結果はVimで実施した実習です。他のvi実装、読者のサーバー設定、キーマッピング、ハングル入力器とターミナルクリップボードの動作は実行検証していません。POSIX公式ページは直接開くとアクセス遮断が発生したため、検索可能な仕様区間で相互確認し、全体仕様本文をダウンロードして検討したわけではありません。詳細説明は以下のVim公式ヘルプと実際のコマンド結果を併用しました。
- POSIX vi仕様: コマンドと入力状態、基本編集コマンドの標準根拠
- POSIX ex仕様: コロンコマンドの保存・終了・置換根拠
- Vim入門、移動と検索、行コピーと貼り付け: 基本実習説明
- Vim置換と行範囲、実行取り消し: 範囲・パターンと実装の違い
コメントを残す