本記事には広告(アフィリエイトリンク)が含まれます。

vi vim 入門 LinuC101 第11回

広告

新卒インフラエンジニア向けLinuC 101 試験対策シリーズの第11回です。本シリーズを通して何度か「vi で開いて」「設定を編集して」と書いてきましたが、今回が vi/vim 専用の回です。

vi はリモートサーバーで作業する技術職にとって避けて通れないエディタです。新卒の挫折ポイント第1位と言ってもよく、「i を押しても何も起きない」「Esc って何のため」と詰まりがちです。本記事は完璧を目指さず、最低限の操作で生き延びるところから段階的に積み上げる構成です。

環境前提

  • ディストリビューション: AlmaLinux 9.6(Sage Margay)
  • ユーザー: developer(sudo NOPASSWD設定済み)
  • 関連VM: linuc-alma(10.0.10.132)
  • 初期状態: vim-minimal のみ(vim-enhanced は記事内で導入 → 末尾削除)
  • nano は AlmaLinux 9 minimal install には未搭載
  • 演習用ディレクトリ ~/linuc-vim/ を作成 → 末尾でクリーンアップ
広告

今ここマップ

LinuC 101 試験対策シリーズ(全12回)

  第1回 Linuxの起動・接続・停止
  第2回 ブートプロセスの仕組み
  第3回 systemdマスター講座
  第4回 プロセス管理とハードウェア基礎
  第5回 仮想マシンとコンテナの基礎
  第6回 パッケージ管理マスター
  第7回 ファイル操作の実践
  第8回 パーミッション・所有者・特殊権限
  第9回 コマンドライン・リダイレクト・パイプ
  第10回 テキスト処理(grep / sed / awk)
▶ 第11回 vi/vim 入門    ← いまここ
  第12回 ディスク・パーティション・ファイルシステム

この記事で身につくこと

  1. ノーマル / インサート / コマンドラインの3モードを切り替えられる
  2. 基本編集操作(i a o x dd yy p u)を実行できる
  3. 検索(/)と置換(:s)、保存(:w)、終了(:q :wq :q!)ができる
  4. ~/.vimrc を作成し、行番号・シンタックスハイライト等の基本設定を有効化できる
  5. nano との違いを理解し、状況に応じて使い分けられる

第1章:なぜ vi を学ぶのか

VS Code や Sublime Text のような GUI エディタは便利ですが、本番サーバーには GUI がありません。SSH で入って、目の前にあるのはターミナル。そこで唯一頼れるのが vi(または vim)です。

  • 最小インストールでも入っているvim-minimal は AlmaLinux/RHEL 系の最小構成パッケージに含まれる
  • 軽い・速い:起動が一瞬で、巨大ファイルでも引っかからない
  • SSH 経由で完璧に動く:マウスもグラフィックも不要
  • 業界標準visudo crontab -e git rebase -i など、多くのツールが裏で vi を起動する

vi と vim は実質同じ

「vi」と「vim」は別物のように見えますが、現代の Linux ではほぼ同じものです。AlmaLinux 9 の /usr/bin/vi は短いシェルスクリプトで、中身を見るとこうなっています。

linuc-almaで実行:

$ file /usr/bin/vi

実行結果:

/usr/bin/vi: a /usr/bin/sh script, ASCII text executable

linuc-almaで実行:

$ head -20 /usr/bin/vi

実行結果(抜粋):

#!/usr/bin/sh

# run vim if:
# - 'vi' command is used and 'vim' binary is available
# - 'vim' command is used
(中略)
if test -f /usr/bin/vim
then
  exec /usr/bin/vim "$@"
fi

つまり、vim がインストールされていればそれを起動、無ければ vim-minimal の本体を起動するラッパースクリプトが vi の実体です。`vi –version` を打つと「VIM – Vi IMproved 8.2 … Small version without GUI.」と表示されます。「古典的な vi」ではなく、機能制限版の vim を見ています。

本記事では便宜上 vivim を区別なく使います。両方とも同じ操作で動きます。

第2章:モードという概念

vi の最大の特徴であり、最大の挫折ポイントが モードです。Windows のメモ帳や VS Code のようなエディタは「キーを押す=文字が入力される」が常識ですが、vi はキーを押す行為が文脈によって意味を持つ仕様です。

2.1 3つのモード

モード役割キーの意味
ノーマルモード(起動直後)移動・コマンド実行ホームポジションのキーがコマンドとして解釈される(h=左、dd=行削除など)
インサートモード文字入力普通のエディタと同じ。打ったキーがそのまま入力される
コマンドラインモードファイル操作・検索置換:/ で始まるコマンドを画面下部で入力

2.2 モード遷移

vi には3つのモードがあり、キー操作でモードを切り替えながら編集します。まずは全体像を図で押さえます。

vi/vimの3モード遷移図。中央上部にノーマルモード(Normal Mode、★起動直後はここ。hjklで移動、ddで削除、yyでコピー・pで貼り付け)、左下にインサートモード(Insert Mode、通常の入力・テキスト追加)、右下にコマンドラインモード(Command-Line Mode、:w :q :wq、:s/old/new/g、/patternで検索)。i,a,o,I,A,O→インサート、Esc→ノーマル、:または/→コマンドライン、Enter/Esc→ノーマル。下部に「困ったらEsc」の注意
図 11-01. vi/vim の3つのモード遷移

「困ったら Esc」が合言葉。何か変なキーを押してしまっても、Esc を1〜2回押せばノーマルモードに戻ります。そこから :q! と打てば必ず終了できます。

📖 試験Tipsボックス:3モードの遷移

主題:1.03.5(重要度:高)
出題パターン:「インサートモードに入るキーは?」「ノーマルモードに戻るキーは?」「コマンドラインモードに入る記号は?」

暗記ポイント

  • 起動直後はノーマルモード
  • ノーマル → インサート:i(カーソル位置)/ a(カーソル直後)/ o(次の行)/ I(行頭)/ A(行末)/ O(前の行)
  • インサート → ノーマル:Esc
  • ノーマル → コマンドライン::(コマンド)/ /(前方検索)/ ?(後方検索)
  • コマンドライン → ノーマル:Enter 実行 / Esc 中止

第3章:最低限の生存セット ── 5コマンドだけ覚える

vi のコマンドは膨大ですが、最初の1週間はこの5つだけで戦えます

キー意味
vi ファイル名起動(ノーマルモードで開く)
iインサートモードに入る(=入力開始)
Escノーマルモードに戻る
:wq保存して終了
:q!変更を破棄して終了(緊急脱出)

これだけで「設定ファイルを開いて1行直して保存」ができます。実際にやってみます。linuc-almaで実行:

$ mkdir -p ~/linuc-vim
$ vi ~/linuc-vim/hello.txt

vi が起動し、空のファイルが開かれます(画面下に ~/linuc-vim/hello.txt [新規] のような表示)。ここで i を押してインサートモードに入り、次のように入力:

Hello, vi!
これは私の最初の vi 編集です。

入力が終わったら Esc でノーマルに戻り、:wq と打って Enter。プロンプトに戻ります。

linuc-almaで実行:

$ cat ~/linuc-vim/hello.txt

実行結果:

Hello, vi!
これは私の最初の vi 編集です。

これで 第3章の目標達成です。実務でやる作業の半分以上はこの5コマンドの組み合わせで終わります。

第4章:移動 ── h j k l と仲間

ノーマルモードで使う移動コマンド。矢印キーも使えますが、ホームポジションから手を動かさない hjkl が vi の流儀です。

キー方向
h
j
k
l

覚え方:j は下に伸びるアルファベット(j の縦棒)/ k は上に伸びる

4.1 単語・行・ファイル単位の移動

キー動き
w / b / e次の単語先頭 / 前の単語先頭 / 単語末尾
0 / $行頭 / 行末
^インデント無視の先頭文字
ggファイル先頭
Gファイル末尾
NG または :NN 行目(例:10G または :10 で10行目)
Ctrl+f / Ctrl+b1ページ進む / 戻る
Ctrl+d / Ctrl+u半ページ下 / 半ページ上

「100行目を見たい」なら :100 + Enter、「1000行のログの末尾を見たい」なら G、「先頭に戻りたい」なら gg。これだけで巨大ファイルでも瞬時に動けます。

第5章:編集 ── 削除・コピー・貼り付け・取り消し

すべてノーマルモードで実行します。キーストロークは「動詞 + 範囲」の組み合わせとして読むと覚えやすい。

キー動作
xカーソル位置の1文字削除
Xカーソル直前の1文字削除
ddカーソル行を削除(同時にクリップボードへ保存される)
5dd5行削除
yy行をコピー(yank)
5yy5行コピー
pカーソル直後に貼り付け
Pカーソル直前に貼り付け
u取り消し(undo)
Ctrl+r取り消しの取り消し(redo)
rxカーソル位置の1文字を x に置換
cwカーソル位置の単語を変更(change word)
ccカーソル行全体を変更

「動詞 + 範囲」のパターンd(削除)+ d(行)= dd で行削除、d + w(単語)= dw で単語削除、d + $(行末)= d$ で「カーソルから行末まで」削除。y(yank)も同じパターン。

📖 試験Tipsボックス:基本編集コマンド

主題:1.03.5(重要度:高)
出題パターン:「カーソル行を削除するには?」「コピー操作は?」「取り消しは?」

暗記ポイント

  • x 1文字削除 / dd 行削除 / 5dd 5行削除
  • yy yank(コピー)/ p 貼り付け(カーソル後) / P 貼り付け(前)
  • u アンドゥ / Ctrl+r やり直し
  • rx 1文字置換 / cw 単語置換 / cc 行置換
  • 動詞 + 範囲のパターン:d+w=dw、d+$=d$、y+w=yw

第6章:検索と置換

6.1 検索

ノーマルモードで / または ? を打つとコマンドラインに「/」または「?」が出ます。検索文字列を入力して Enter。

  • /pattern + Enter:前方検索(ファイル末尾方向)
  • ?pattern + Enter:後方検索(ファイル先頭方向)
  • n:次のマッチへ移動
  • N:前のマッチへ移動(逆方向)

パターンには第10回で学んだ正規表現が使えます(vim は ERE に近い文法)。/error で「error」を含む箇所、/^# でコメント行、など。

6.2 置換 ── sed と同じ文法

コマンドラインモード(: から始まる)で s コマンドを使います。第10回 sed の s/pat/rep/g とほぼ同じ文法。

コマンド動作
:s/old/new/カーソル行で最初の old を new に置換
:s/old/new/gカーソル行の全箇所の old を new に置換
:%s/old/new/gファイル全行・全箇所の old を new に置換
:%s/old/new/gc確認付き全置換(c = confirm)
:5,10s/old/new/g5〜10行目で全置換(行範囲指定)

第10回の sed -i 's/old/new/g' と同じ感覚で、vi の中から実行できると理解すると一気に身近になります。

📖 試験Tipsボックス:検索と置換

主題:1.03.5(重要度:高)
出題パターン:「ファイル全体で置換するコマンドは?」「行内全置換は?」「次の検索結果へ移動するキーは?」「確認付きで置換するには?」

暗記ポイント

  • /pat 前方検索 / ?pat 後方検索 / n 次 / N
  • :s/old/new/ 行内最初 / :s/old/new/g 行内全
  • :%s/old/new/g ファイル全 / :%s/old/new/gc 確認付き
  • :5,10s/old/new/g 行範囲指定
  • 第10回 sed と同じ s コマンド

第7章:保存・終了のバリエーション

コマンド動作
:w保存(書き出し)
:w newfile別名で保存
:q終了(変更があると拒否される)
:wq保存して終了
:x変更がある場合のみ保存して終了
ZZ(ノーマル):x と同等のショートカット
:q!変更を破棄して終了
:e file別ファイルを開く(バッファ切替)
:e!現在のファイルを再読み込み(編集を破棄)

:q で終了しようとすると、変更がある場合は「E37: 最後に変更してから保存していません」と拒否されます。保存して終了なら :wq、破棄して終了なら :q!

第8章:~/.vimrc で設定を永続化

vi は素のままだと行番号も色付けも無く、現代のエディタに比べて素っ気ない見た目です。~/.vimrc という設定ファイルに数行書くだけで、見た目が一気に整います。

ただし、シンタックスハイライトなどの高度な機能は vim-enhanced パッケージが必要です。AlmaLinux 9 minimal install には未導入なので、dnf install で入れます。

linuc-almaで実行:

$ sudo dnf install -y vim-enhanced

実行結果(末尾のみ):

インストール済み:
  vim-common-2:8.2.2637-23.el9_7.3.x86_64
  vim-enhanced-2:8.2.2637-23.el9_7.3.x86_64
  vim-filesystem-2:8.2.2637-23.el9_7.3.noarch

完了しました!

これで /usr/bin/vim/usr/bin/vimtutor が使えるようになりました。vi を打つと第1章のラッパースクリプトが /usr/bin/vim を発見し、自動的にフル機能の vim にフォールスルーします。

8.1 おすすめ ~/.vimrc

linuc-almaで実行:

$ cat > ~/.vimrc <<'EOF'
set number          " 行番号表示
set ruler           " カーソル位置表示
set showcmd         " 入力中コマンド表示
set hlsearch        " 検索結果ハイライト
set incsearch       " インクリメンタル検索
set ignorecase      " 検索で大文字小文字を無視
set smartcase       " ただし大文字を含むときは区別
set tabstop=4       " タブ幅 4
set expandtab       " タブをスペースに展開
syntax on           " シンタックスハイライト
EOF

linuc-almaで実行:

$ cat ~/.vimrc

実行結果:

set number          " 行番号表示
set ruler           " カーソル位置表示
set showcmd         " 入力中コマンド表示
set hlsearch        " 検索結果ハイライト
set incsearch       " インクリメンタル検索
set ignorecase      " 検索で大文字小文字を無視
set smartcase       " ただし大文字を含むときは区別
set tabstop=4       " タブ幅 4
set expandtab       " タブをスペースに展開
syntax on           " シンタックスハイライト

この状態で vi ~/linuc-vim/hello.txt を起動すると、左端に行番号、カーソル位置(右下)、検索ハイライトが反映されます。

8.2 一時的な設定

「今だけ行番号を出したい」なら、vim 内で :set number(または短縮形 :se nu)を実行。そのセッション限りで反映されます。:set nonumber または :set nu! で解除。

システム全体に適用したい場合は、/etc/vimrc を編集(root 権限)。ただし通常はユーザーごとの ~/.vimrc で十分です。

📖 試験Tipsボックス:保存・終了と .vimrc

主題:1.03.5(重要度:高)
出題パターン:「保存して終了するコマンドは?」「破棄して終了するコマンドは?」「行番号を常に表示するには?」「シンタックスハイライトを有効にするには?」

暗記ポイント

  • :w 保存 / :q 終了 / :wq 保存終了 / :q! 破棄終了 / ZZ 保存終了の短縮
  • 永続設定:~/.vimrc (個人)/ /etc/vimrc(システム全体)
  • set number 行番号 / syntax on シンタックスハイライト
  • set tabstop=4 タブ幅 / set expandtab タブをスペースに
  • set hlsearch 検索ハイライト / set ignorecase 大小無視

第9章:vimtutor で練習する

vim には 30分の対話チュートリアルが付属します。vim-enhanced 導入後、vimtutor を起動するだけ。

linuc-almaで実行:

$ vimtutor

vim が起動し、英語版チュートリアルが開きます(日本語版は vimtutor ja)。1日30分、3日続ければ実用レベルに届きます。本記事を読み終わったら、まず vimtutor をやってみてください。

第10章:nano という選択肢

vi が苦手な新人の避難経路として nano があります。「画面下にショートカットが書いてあるモードレスエディタ」で、メモ帳に近い感覚です。

AlmaLinux 9 minimal install には未搭載なので、必要なら sudo dnf install -y nano で導入します。

nano の操作説明
nano file起動(既にインサート相当の状態)
Ctrl+O保存(Write Out)
Ctrl+X終了
Ctrl+W検索(Where is)
Ctrl+\置換(Replace)

ただし現場の暗黙ルールでは vi が事実上の標準です。visudo crontab -e git rebase -i などのツールは EDITOR 環境変数で vim を起動する想定が多く、いつか必ず vi に出会います。「両方知った上で vi を選ぶ」のがバランスのよい姿勢です。

第11章:現場での使いどころ

  • SSH 設定の1行修正sudo vi /etc/ssh/sshd_config/PermitRootLogin で検索 → 該当行を編集 → :wqsudo systemctl reload sshd
  • cron ジョブの追加crontab -e(裏で vi が起動)でジョブを書き、:wq で構文チェック後に登録
  • sudoers の編集sudo visudo で構文チェック付き編集。文法エラーがあれば保存時に弾かれる
  • 緊急対応の本番ログイン:「設定を1行戻して再起動」が最頻出。vi のモード概念が体に染みていないと焦るため、平時から練習しておく
  • YAML(Ansible playbook 等)の編集:インデントが命なので set list で空白可視化、set expandtab でタブ混入防止
  • 自動化スクリプトでの編集ex -s -c '%s/old/new/g' -c 'wq' file で非対話の一括置換(sed -i と同じ用途)

第12章:ヒヤリハット ── :q! を打ち忘れて離れられない

⚠️ vi から脱出できずパニック

新人K君は本番サーバーで /etc/ssh/sshd_config を確認しようと sudo vi /etc/ssh/sshd_config を実行。設定を見終わって終了しようとしましたが、うっかり何かのキーを押して中身が変わってしまったようで、:q が「E37: 最後に変更してから保存していません」で拒否されます。

パニックになった K 君は :wq で保存しようとし、意図しない変更が入った状態の sshd_config が本番に書き込まれてしまいました。直後に systemctl reload sshd していなかったため即時障害は回避できましたが、後日のサーバー再起動で SSH デーモンが起動失敗。コンソール経由で復旧する羽目に。

教訓

  • 変更を加えるつもりがないなら vi ではなく view または vi -R(読み取り専用モード)で開く
  • 変更してしまった場合は必ず :q! で破棄:wq で保存しない
  • 「困ったら Esc → :q!」を体に覚え込ませる。呪文化するくらい繰り返す
  • 本番設定変更後は必ず構文チェッカー(sshd -tnginx -tvisudo -c)で検証してから reload
  • SSH 設定を書き換える時は別ターミナルで現セッションを保ったまま新規接続テスト。新規接続が通るまで現セッションを切らない

類似事例Caps Lock が入った状態で hjkl が大文字になり、HJKL として解釈されて画面がいきなり別の場所にジャンプ ── 何が起きたか分からずパニック。キーボードの状態を常に確認する習慣も意外と重要です。

やってみよう

linuc-alma にログインしている前提で、演習1〜4を順に実行してください。

演習1:vi/vim/nano の正体を確認

  1. which vi vim 2>&1(vim は未導入で no found のはず)
  2. rpm -q vim-minimal vim-enhanced
  3. file /usr/bin/vi(シェルスクリプトと表示される)
  4. head -20 /usr/bin/vi(中身を確認)
  5. vi --version | head -5(VIM 8.2 Small version と出る)
  6. which nano 2>&1(minimal install では no found)

演習2:5コマンド戦法(生存セット)

  1. mkdir -p ~/linuc-vim
  2. vi ~/linuc-vim/hello.txt で起動
  3. i でインサートモード
  4. 「Hello, vi!」と「これは私の最初の vi 編集です。」を入力
  5. Esc でノーマルモード
  6. :wq + Enter で保存して終了
  7. cat ~/linuc-vim/hello.txt で内容確認

演習3:移動・編集・置換

  1. 事前にサンプルファイルを作る:printf 'apple\nbanana\ncherry\ndate\nfig\n' > ~/linuc-vim/sample.txt
  2. vi ~/linuc-vim/sample.txt で起動
  3. ノーマルで gg(先頭行)→ j(1行下)
  4. dd で2行目(banana)削除
  5. u でアンドゥ(banana が戻る)
  6. /cherry + Enter で検索
  7. :%s/apple/APPLE/g で全置換
  8. :wq で保存終了
  9. cat ~/linuc-vim/sample.txt で結果確認

演習4:vim-enhanced 導入と .vimrc

  1. sudo dnf install -y vim-enhanced
  2. which vim vimtutor(両方表示される)
  3. 本文 8.1 のヒアドキュメントで ~/.vimrc を作成
  4. vi ~/linuc-vim/sample.txt で起動 → 行番号が表示されることを確認 → :q
  5. vimtutor で対話チュートリアル起動 → 第1章の冒頭だけ進めて :q! で離脱(本格的にやるのは後で)
  6. クリーンアップ
    • mv ~/.vimrc ~/.vimrc.linuc11.bak(既存の .vimrc を保護)
    • sudo dnf remove -y vim-enhanced
    • rm -rf ~/linuc-vim
    • rm -f ~/.vimrc.linuc11.bak(演習用の vimrc を完全削除)

分からないコマンドは man vi や、vim 内で :help(チュートリアル付き)で調べてください。vimtutor を真面目にやると、本記事の8割は身につきます。

理解度チェック

○か×で答えてください。回答と解説は次回冒頭で振り返ります。

  1. vi を起動した直後はインサートモードである。
  2. :wq は変更を破棄して終了するコマンドである。
  3. ノーマルモードの dd はカーソル行を削除し、その内容はクリップボードに保持される(p で貼り付け可能)。
  4. :%s/old/new/g はファイル全体で old を new に置換する。
  5. AlmaLinux 9 minimal install の /usr/bin/vi は単独のバイナリで、vim とは別のプログラムである。

解答

  • 1. × 起動直後はノーマルモード。インサートに入るには i などを押す
  • 2. × :wq保存して終了。破棄して終了は :q!
  • 3.  dd は削除と同時にバッファに保存。p で貼り付けできる(=「カット&ペースト」相当)
  • 4.  % はファイル全体、s は置換、g は行内全部の意味
  • 5. × /usr/bin/viシェルスクリプトラッパー。中身は VIM 8.2 Small version で、vim と実質同じ

次回予告

次回は「ディスク・パーティション・ファイルシステム(fdisk, mkfs, mount, LVM)」です。LinuC 101 シリーズの最終回。サーバーの「ストレージ」を扱います。MBR と GPT の違い、パーティション作成、ファイルシステム作成、マウント、LVM の基礎まで。物理/仮想を問わず、ディスクを増設する場面で必ず必要になる知識です。

LinuC 101 試験対策シリーズ 全12回

広告
Linux
スポンサーリンク