Vim入門 - 基本操作と実践テクニック
この記事でできるようになること
- モードを切り替えて「抜け出せない」状態から自力で復帰できる
- 保存・破棄・強制終了を状況に応じて選べる
- 検索置換を確認モードで安全に実行できる
前提知識(先に読むと理解しやすい記事)
この記事で身につくこと
- Vim の モード を切り替えて、「抜け出せない」状態から自力で復帰できるようになります。
- 移動・編集・検索置換について、実務で使う最低限の型 が身につきます。
- 保存・破棄・強制終了を、状況に応じて選べるようになります。
.vimrcで 快適な初期設定 ができるようになります。- サーバ作業で
viしか入っていない状況でも、手が止まらなくなります。
想定読者:SSH でサーバに入って設定ファイルを直す必要が出てきた人。Vim を開いて閉じられなかった経験があるなら、ちょうどこの記事の対象です。
先に用語を整理する
Vim の説明で必ず出てくる言葉を、ここで一度だけ定義します。
- モードとは、同じキーを押しても動作が変わる「今の状態」のことです。Vim には移動用の状態と文字入力用の状態が別々にあります。
- ノーマルモードとは、移動・削除・コピーを行う状態です。「コマンドモード」と呼ぶ資料もありますが、この記事では後述のコマンドラインモードと区別するため「ノーマルモード」で統一します。
- 挿入モードとは、キーを押すとその文字が本文に入る状態です。「インサートモード」とも呼びます。
- コマンドラインモードとは、
:を押して保存・終了・置換などの命令を打ち込む状態です。「Ex コマンド」と呼ぶこともあります。 - バッファとは、Vim がメモリ上に読み込んでいるファイルの内容です。バッファを編集してもディスク上のファイルはまだ変わりません。
:wで書き込んだ時点で初めてファイルが変わります。 - ヤンク(yank)とは、Vim でのコピー操作の呼び名です。「コピー」と読み替えて構いません。
- スワップファイルとは、編集内容を一時保存する
.swpという隠しファイルです。異常終了しても内容を回収できるようにする仕組みです。
結論(実務の型)
- 起動したら まずノーマルモード(
Esc)を意識する - 編集は
i→ 編集 →Esc→:wの 4 ステップが基本 - 抜けられなくなったら
Escを 2 回押して:q!で強制終了 - 設定ファイル編集は
sudo vimではなくsudoeditを使う
前提(対象環境)
- OS:Ubuntu / 他 Linux 一般
- Vim 8 以降 または Neovim(vi 互換動作にも触れる)
- SSH 越しのリモートサーバ作業を主に想定
1. モード:これだけで 8 割解決
結論: Vim の難しさはモードに集約され、ノーマル・挿入・ビジュアル・コマンドラインの 4 つを理解すれば 8 割解決する。
Vim が初心者を脱落させる最大の原因は モード の存在。逆に言えば、モードさえ理解できれば残りは「コマンドの暗記」だけ。
| モード | 入り方 | 何ができる |
|---|---|---|
| ノーマル | Esc |
移動・削除・コピー |
| 挿入 | i / a / o |
文字入力 |
| ビジュアル | v / V |
範囲選択 |
| コマンドライン | : |
保存・終了・置換 |
鉄則: 何か変なことが起きたら、まず Esc を 2 回押してノーマルモードに戻る。
今どのモードにいるかは画面左下で判断できる。挿入モードなら -- INSERT --、ビジュアルモードなら -- VISUAL -- と表示される。何も表示されていなければノーマルモードにいる。Esc は何度押しても害がないため、迷ったら押して構わない。
1-1. 挿入モードへの入り方(使い分け)
i # カーソル位置の前に挿入 a # カーソル位置の後に挿入(行末で使う) o # 下に新規行を開いて挿入 O # 上に新規行を開いて挿入 I # 行頭に挿入 A # 行末に挿入
最初のうちは i と o だけで十分。慣れたら A(行末追記)が便利。
2. 保存と終了:最頻出の事故ポイント
結論:
:wで保存、:wqで保存終了、:q!で破棄終了。抜けられない事故はこの 3 つで解決する。
「Vim から抜けられない」問題はここで全部解決する。
:w # 保存(write) :q # 終了(quit) :wq # 保存して終了 :x # 保存して終了(:wq と同じ。変更がなければ書き込まない) ZZ # ノーマルモードで :wq 相当 :q! # 保存せず強制終了 :w !sudo tee % > /dev/null # sudo で開き忘れたファイルを保存(詳細は 2-1)
:q だけだと「未保存の変更があります」で蹴られる。捨ててよいなら :q!、保存したいなら :wq。
:q! は編集内容を捨てる
! は「確認せず実行する」という指示。失敗するとどうなるかは明確で、:q! で抜けた場合、それまでの編集内容はすべて失われる。undo では戻せない。
安全に試す方法は次の 2 つ。
- 保存したいのか捨てたいのか迷ったら、まず
:w ~/backup.txtで別名保存してから:q!で抜ける。 - 設定ファイルを編集する前に
cp /etc/ssh/sshd_config ~/sshd_config.bakでコピーを取る。書き戻せる状態を作ってから編集を始める。
2-1. sudo で開き忘れた事故の回復
/etc/ 配下を vim で開いて編集後、保存時に Permission denied で詰む定番事故。
:w !sudo tee % > /dev/null
%は現在開いているファイル名に展開されるteeで書き込み、> /dev/nullで標準出力を捨てる- 保存後
:q!(既にディスクへ書かれているため!でよい)
そもそも設定ファイル編集は sudoedit /etc/ssh/sshd_config(または sudo -e)が安全。一時ファイルで編集し、終了時に上書きされる。
3. 移動:マウスを使わずに飛ぶ
結論: 移動は
hjkl・単語/行/画面単位・検索ベースをノーマルモードで使い分けると素早く飛べる。
ノーマルモードで使う。挿入モードでは効かないので注意。
3-1. 1 文字単位
h j k l # 左 下 上 右
hjkl の覚え方:j が ↓(落ちる)、k が ↑(突き上げる)。
3-2. 単語・行・画面単位
w / b # 次の単語頭 / 前の単語頭 e # 単語末尾 0 / ^ / $ # 行頭 / 行頭(空白除く) / 行末 gg / G # ファイル先頭 / 末尾 :42 # 42 行目へジャンプ Ctrl-d / Ctrl-u # 半画面 下 / 上 Ctrl-f / Ctrl-b # 1画面 下 / 上
3-3. 検索ベース移動
/word # 前方検索 ?word # 後方検索 n / N # 次 / 前のマッチへ * # カーソル位置の単語を前方検索
実務 Tips: ログを見るときは G で末尾に飛び、?ERROR で後方検索すると早い。
4. 編集:最低限これだけ
結論: 削除
x/dd、コピーyy、貼付p、取消u、繰返し.の数個で日常編集は足りる。
x # 1 文字削除 dd # 1 行削除(クリップボードへ) 3dd # 3 行削除 dw # 単語削除 d$ / D # 行末まで削除 yy # 1 行コピー(yank) 3yy # 3 行コピー p / P # 貼り付け(後 / 前) u # 取り消し(undo) Ctrl-r # やり直し(redo) . # 直前の操作を繰り返し
最強コマンドは .(ドット)。直前の編集操作を再実行する。dw(単語削除)→ 別の場所で . で同じ削除が走る。
4-1. 数値プレフィックス
ほとんどのコマンドは数値を前置できる。
5j # 5 行下へ 10x # 10 文字削除 3yy # 3 行コピー
5. 検索と置換:実務で一番使う
結論: 検索は
/pattern、置換は:%s/foo/bar/g。強力なのでgcで確認しながら進めると安全。
5-1. 検索
/pattern # 前方検索(正規表現可) ?pattern # 後方検索 n / N # 次 / 前
5-2. 置換(最重要)
:s/foo/bar/ # 現在行の最初の foo を bar に :s/foo/bar/g # 現在行のすべて :%s/foo/bar/g # ファイル全体すべて :%s/foo/bar/gc # ファイル全体、確認しながら :5,10s/foo/bar/g # 5〜10 行目のすべて
末尾の g(global)は「その行のすべての一致」、c(confirm)は「1 件ずつ確認する」という指定。% はファイル全体を対象にする範囲指定。
全置換は一括で本文を書き換える
:%s/foo/bar/g はファイル全体を一度に書き換える。失敗するとどうなるかは次のとおり。
- パターンが広すぎると、意図しない箇所まで置換される。設定ファイルなら構文が壊れてサービスが起動しなくなる。
- 置換直後なら
u(undo)で戻せる。ただし:wで保存して Vim を終了したあとは、undo 履歴が消えるため戻せない(set undofile未設定の場合)。
安全に試す方法は次の 3 段階。
- まず
/fooで検索して、何件どこに当たるかを目で見る。 :%s/foo/bar/gcの確認モードで実行し、y(はい)/n(いいえ)/a(残り全て)/q(中止)で 1 件ずつ判断する。- 想定外の置換をしてしまったら、保存する前に
uを押して戻す。
5-3. 正規表現の罠
Vim の正規表現は POSIX 拡張正規表現と微妙に違う。
:%s/\v(\w+)\s+\1/\1/g # \v で very magic モード(標準的な正規表現に近づく)
\v を付けると () + ? のエスケープが不要になる。覚えておくと事故が減る。
6. 複数ファイル・ウィンドウ
結論: バッファで複数ファイルを切り替え、
:sp/:vspの分割ウィンドウで並べて作業できる。
6-1. バッファ(複数ファイル)
:e other.txt # 別ファイルを開く :ls # 開いているバッファ一覧 :b 2 # バッファ番号 2 へ :bn / :bp # 次 / 前のバッファ :bd # バッファを閉じる
6-2. 分割ウィンドウ
:sp file.txt # 水平分割 :vsp file.txt # 垂直分割 Ctrl-w w # ウィンドウ移動 Ctrl-w q # ウィンドウ閉じる Ctrl-w = # サイズ均等化
ログを片側、設定ファイルを片側で開きながら作業すると効率的。SSH 越しなら tmux と組み合わせるとさらに強い。
7. ビジュアルモード:範囲選択して操作
結論:
v/V/Ctrl-vで範囲選択し、削除・コピー・インデント・置換をまとめて適用できる。
v # 文字単位の選択開始 V # 行単位の選択開始 Ctrl-v # 矩形(ブロック)選択
選択中に:
d # 削除 y # コピー > # インデント < # 逆インデント :s/a/b/ # 選択範囲内のみ置換
矩形選択の活用: 複数行の行頭に # を付ける(コメントアウト)操作は Ctrl-v → 行範囲選択 → I → # → Esc で一括処理できる。
8. .vimrc:最低限の設定
結論:
~/.vimrcに行番号・検索・インデント・バックアップ等の最小設定を書けば快適に使える。
~/.vimrc に書く。新しいサーバに入るたびに 30 秒で書ける程度のミニマム設定。
" 基本
set number " 行番号表示
set ruler " カーソル位置表示
set showcmd " 入力中コマンド表示
set wildmenu " コマンド補完を強化
" 検索
set hlsearch " 検索結果ハイライト
set incsearch " インクリメンタルサーチ
set ignorecase " 大文字小文字無視
set smartcase " 大文字を含む検索は区別
" インデント
set autoindent " 自動インデント
set expandtab " Tab をスペースに
set tabstop=4 " Tab 幅
set shiftwidth=4 " 自動インデント幅
" 安全
set backup " バックアップ作成
set backupdir=~/.vim/backup,/tmp
set undofile " undo 履歴を保存
set undodir=~/.vim/undo
" UI
syntax on " シンタックスハイライト
set background=dark " 暗い背景前提
~/.vim/backup と ~/.vim/undo ディレクトリは事前に mkdir -p で作成しておく。
リモートサーバで vi しかない(Vim 互換モード)場合、set の一部が効かない。:version で確認可能。
9. 詰まったときの脱出術
結論: 抜けられない・保存不可・画面停止・スワップ残りなど典型の詰まりには機械的な脱出手順がある。
実際に詰まる典型ケースと、機械的な脱出手順。
9-1. 抜けられない
Esc Esc :q!
ノーマルモードへ確実に戻ってから強制終了。
9-2. 保存できない(読み取り専用)
:set noreadonly :w
または :w !sudo tee % > /dev/null。
9-3. 画面が固まった
Ctrl-q # Ctrl-s で停止した端末を再開
Ctrl-s はターミナル側の出力停止。Vim の問題ではない。
9-4. 画面左端に ~ が並ぶ
これは異常ではない。~ は「この行にはまだ何もない」ことを示す Vim の通常表示で、ファイル末尾より下の領域に必ず出る。対処は不要。
同様に、編集後に file.txt~ のような ~ 付きファイルが増えている場合も異常ではない。これは後述の .vimrc の set backup が作るバックアップファイルで、スワップファイルとは別物。不要なら削除してよい。
9-5. 起動時に E325: ATTENTION が出る
スワップファイル(.swp)が残っている。前回 Vim が正常終了しなかった、または誰かが同じファイルを開いているサイン。
E325: ATTENTION Found a swap file by the name ".file.txt.swp"
ls -la .*.swp :recover # Vim 起動後に実行
:recover で復旧できた内容を確認し、必要な分を保存したうえで rm .file.txt.swp する。スワップファイル名は「. + 元のファイル名 + .swp」の形になる。
スワップファイルを反射的に削除しない
.swp を消すと、そこに退避されていた未保存の編集内容も消える。失敗するとどうなるかは次の 2 点。
- 自分の未保存作業を消してしまう。
:recoverで回収できたはずの内容が失われる。 - 他人が今まさに同じファイルを編集中だった場合、その編集を壊す。
安全に試す方法は削除前に 2 つ確認すること。
ps aux | grep vim # 誰かが編集中でないか確認
編集中のプロセスがなく、:recover の内容も不要だと確認できてから削除する。
10. vi と Vim と Neovim
結論: vi は多くが Vim の互換モード、Vim がデファクト、Neovim は Lua 設定や LSP を備えたフォーク。
| 名前 | 実体 | 備考 |
|---|---|---|
| vi | 多くの場合 Vim の vi 互換モード | 一部設定が無効化される |
| Vim | Vi IMproved | デファクトスタンダード |
| Neovim | Vim のフォーク | Lua 設定・LSP 統合・モダンな実装 |
which vi ls -l $(which vi)
/usr/bin/vi lrwxrwxrwx 1 root root 20 Feb 15 2024 /usr/bin/vi -> /etc/alternatives/vi
-> の右側が実体。Ubuntu では /etc/alternatives/vi 経由で vim.basic や vim.tiny に繋がっている。どれが実体かで使える設定が変わる。
Ubuntu 最小構成だと vim-tiny しか入っていない場合がある。sudo apt install vim で full 版を入れる。
11. まとめ:明日から使う型
コピペ用:最低限の作業フロー
# 1. 開く vim file.txt # 2. ノーマルモードで移動 gg # 先頭へ /keyword # 検索 # 3. 挿入モードへ i # 編集開始 (編集) Esc # ノーマルへ戻る # 4. 保存して終了 :wq # 失敗した場合 :q! # 捨てて終了
作業完了チェックリスト
- [ ] 画面左下の表示で、今どのモードにいるか判断できた
- [ ]
:wq(保存して終了)と:q!(破棄して終了)を意識して選べた - [ ] 全置換の前に
/patternで対象を確認した - [ ] 設定ファイルの編集は
sudoeditまたはバックアップ取得後に行った - [ ]
.swpを消す前にps aux | grep vimで編集中プロセスを確認した
やってはいけないこと
- 挿入モードのまま
:wqと打つ(本文に:wqが入る) sudo vim /etc/...で開いて保存時に詰む →sudoeditを使う- スワップファイルを脊髄反射で削除する → 他人の編集中の可能性
.vimrcを巨大化させる → サーバごとに使い回せなくなる