15.

vi / Vim テキストエディタ完全ガイド (モード / 移動 / 検索置換)

編集
この記事の要点
  • vi は Unix 標準のテキストエディタ、現代では Vim (Vi IMproved) が事実標準
  • 4 つのモード: Normal (移動・操作) / Insert (入力) / Visual (選択) / Command (: 開始)
  • 基本: vi file 起動 → i Insert → 編集 → Esc:wq 保存終了
  • 移動: h j k l (左下上右) / w b (単語) / gg G (先頭末尾) / /word (検索)
  • Neovim (Lua / LSP / Tree-sitter) が現代の主流、IDE 機能も VS Code 並みに進化

vi / Vim とは

vi は 1976 年に Bill Joy が開発した Unix 標準のテキストエディタです。現在の Linux / macOS では vi コマンドは多くの場合 Vim (Vi IMproved) のシンボリックリンクとなっており、機能拡張された Vim が実体です。

Vim の特徴は モード制で、キーストロークを最小化し高速にテキストを編集できることです。CUI 環境 (SSH 接続先サーバ) でも動作するため、サーバ運用エンジニアには必須スキル。学習曲線は急ですが、習得後の編集効率は圧倒的です。

起動と終了

# ファイルを開く
vi file.txt

# 複数ファイル
vi file1.txt file2.txt
# :n で次、:N で前

# 行番号指定で開く
vi +42 file.txt        # 42 行目にカーソル
vi +/search file.txt   # search にマッチする行へ

# 読み取り専用
vi -R file.txt
view file.txt

4 つのモード

モード用途突入抜ける
Normal (起動時)移動・コピー・削除Esc各コマンドで他モードへ
Insert文字入力i / a / oEsc
Visual範囲選択v / V / Ctrl+vEsc
Command-line保存・終了・置換: / / / ?Enter / Esc

「困ったら Esc 連打で Normal に戻る」を覚えておけば事故は起きません。

保存と終了

:w              " 保存
:w newfile.txt  " 名前を付けて保存
:q              " 終了 (未保存なら拒否)
:q!             " 強制終了 (変更破棄)
:wq             " 保存して終了
:wq!            " 強制保存して終了 (読み取り専用上書き)
ZZ              " 保存して終了 (Normal モード)
ZQ              " 保存せず終了
:x              " 変更があれば保存して終了 (:wq とほぼ同じ)

カーソル移動

" 1 文字単位 (HJKL 配列、ホームポジション維持)
h    " 左
j    " 下
k    " 上
l    " 右

" 単語単位
w    " 次の単語先頭
b    " 前の単語先頭
e    " 単語末尾

" 行
0    " 行頭
^    " 行頭 (空白以外の最初)
$    " 行末

" 画面
H    " 画面先頭 (High)
M    " 画面中央 (Middle)
L    " 画面末尾 (Low)

" ファイル全体
gg   " ファイル先頭
G    " ファイル末尾
42G  " 42 行目
:42  " 42 行目 (Command-line から)

" 検索
/word  Enter   " 前方検索
?word  Enter   " 後方検索
n              " 次の一致
N              " 前の一致
*              " カーソル位置の単語を検索

Insert モードへの遷移パターン

キー動作
iカーソル位置の直前から入力
I行頭から入力
aカーソルの直後から入力
A行末から入力
o下に空行を作って入力
O上に空行を作って入力
s1 文字削除して入力
S行全体削除して入力
cw単語を削除して入力

削除・コピー・ペースト

" 削除
x       " 1 文字削除
dd      " 1 行削除 (クリップボードに保持)
3dd     " 3 行削除
dw      " 単語削除
d$      " 行末まで削除 (D も同じ)
d0      " 行頭まで削除

" コピー (yank)
yy      " 1 行コピー
3yy     " 3 行コピー
yw      " 単語コピー

" ペースト
p       " カーソルの後にペースト
P       " カーソルの前にペースト

" Undo / Redo
u       " Undo
Ctrl+r  " Redo
.       " 直前の操作を繰り返し

検索と置換

" 検索
/word        " 前方検索
?word        " 後方検索
n / N        " 次 / 前
*            " カーソル単語を検索

" 置換 (Command-line)
:s/old/new/         " カーソル行の最初の old を new に
:s/old/new/g        " カーソル行の全 old を new に
:%s/old/new/g       " ファイル全体
:%s/old/new/gc      " 全体、確認しながら
:5,20s/old/new/g    " 5-20 行目のみ

" 大文字小文字無視
:%s/old/new/gi

" 正規表現
:%s/\d\+/NUM/g      " 数字を NUM に置換
:%s/^/# /           " 各行の先頭に # 追加 (コメントアウト)
:%s/\s\+$//         " 行末の空白削除

Visual モード

v        " 文字単位の選択開始
V        " 行単位の選択開始
Ctrl+v   " 矩形選択開始

" 選択後の操作
d        " 削除
y        " コピー
c        " 削除して Insert モード
>        " インデント右
<        " インデント左
:s/old/new/g  " 選択範囲のみ置換

便利な機能

" 行番号表示
:set number       " 表示
:set nonumber     " 非表示

" 構文ハイライト
:syntax on

" インデント
:set autoindent
:set smartindent
:set tabstop=4
:set shiftwidth=4
:set expandtab    " Tab をスペースに

" 検索ハイライト
:set hlsearch
:set incsearch    " 入力中も検索

" 行末の改行コード
:set fileformat=unix

" 文字コード
:set encoding=utf-8
:e ++enc=cp932 file.txt   " Shift_JIS で開き直し

" ファイル間移動
:e other.txt      " 別ファイルを開く
:bn               " 次のバッファ
:bp               " 前のバッファ
:ls               " バッファ一覧

" ウィンドウ分割
:sp               " 水平分割
:vsp              " 垂直分割
Ctrl+w h/j/k/l    " ウィンドウ間移動

" マクロ
qa                " a レジスタに記録開始
[操作]
q                 " 記録終了
@a                " 再生
10@a              " 10 回再生

~/.vimrc で設定永続化

" ~/.vimrc に書くと毎回適用される
set number
set relativenumber
syntax on
set autoindent
set tabstop=4
set shiftwidth=4
set expandtab
set hlsearch
set incsearch
set ignorecase
set smartcase
set encoding=utf-8
set fileformat=unix
set clipboard=unnamed   " システムクリップボードと連携 (macOS)
colorscheme desert

" キーマップ
nnoremap  h
nnoremap  j
nnoremap  k
nnoremap  l

Vim vs Neovim

観点VimNeovim
初リリース1991 年2015 年 (Vim fork)
設定言語Vim script (+ Lua 9.0+)Lua ファースト
LSP 統合vim-lsp プラグイン組み込み nvim-lspconfig
Tree-sitterプラグイン組み込み
非同期 API後発で追加最初から
2026 年の主流サーバ常駐開発機の主流

新規に学ぶなら Neovim + LazyVim / AstroNvim / LunarVim のディストリビューションが推奨です。VS Code に近い IDE 体験を Vim キーバインドで得られます。

vi / Vim の現代的な学習方法

  • vimtutor コマンド: 30 分の公式チュートリアル (vim 同梱)
  • VS Code に Vim 拡張を入れて慣らす
  • Vim Adventures」: ゲーム式学習
  • 「Practical Vim」(Drew Neil) / 「実践 Vim」: 古典良書
  • Neovim 環境構築は LazyVim ディストリ で 5 分

FAQ

Q: Esc が遠くて使いづらい
A: Ctrl+[ も Esc と同じ。または jj / jk を Esc にマッピングするのが定番:
inoremap jk

Q: 終了の仕方が分からなくて困った
A: Esc:q! Enter。変更を捨てて強制終了。「Vim から抜け方」は世界で年間 100 万人が検索する問題です。

Q: Vim と Emacs どちらを学ぶべき?
A: SSH 先サーバでも使える Vim 優先。Emacs は独自の世界 (Org-mode 等) で深い。両刀使いも可。

Q: VS Code から Vim に乗り換えるべき?
A: 乗り換えではなく VS Code に Vim 拡張が最強。両方の良いとこ取り。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ls ファイル/ディレクトリ一覧表示
  2. sudo ユーザー指定
  3. cron/crontab ジョブの自動実行と登録方法
  4. wget http通信によるファイルダウンロード
  5. rm ファイル/ディレクトリ削除
  6. pwd カレントディレクトリの表示
  7. cd ディレクトリの移動
  8. ./configure
  9. make
  10. make install
  11. unzip ファイルの解凍
  12. mv ファイル/ディレクトリの移動および名称変更
  13. mkdir ディレクトリの作成
  14. touch 空ファイルの新規作成
  15. vi テキストディタの使用
  16. find ファイル/ディレクトリ検索
  17. grep 文字列の検索
  18. tail ファイルの末尾表示
  19. curl HTTP通信によるリクエスト
  20. nslookup ドメインのIP解決
  21. apt update パッケージリストの情報を更新
  22. apt upgrade パッケージの更新
  23. ln リンク/ショートカットの作成と削除
  24. rsync ファイル/ディレクトリの同期
  25. ssh リモートとの暗号化通信
  26. scp sshを利用したファイルのコピー
  27. unzip zip ファイルを解凍する
  28. cp ファイル/ディレクトリのコピー
  29. diffファイルの差分抽出
  30. fdisk ハードディスクに対する操作
  31. lsblk デバイスをツリー状で表示する
  32. kill プロセスを終了させる
  33. zip ファイルやディレクトリをzip形式に圧縮する
  34. host ドメインからIPアドレスを確認
  35. chmod 権限の変更
  36. ip IPアドレスの確認
  37. chown ファイル/ディレクトリ所有者の変更
  38. chgrp ファイル/ディレクトリのグループ情報の変更
  39. nohupと'&' プログラムのバックグラウンド実行(ssh接続時)
  40. lsof 開いているポート番号の確認
  41. tar ファイルの圧縮と解凍
  42. file ファイルの種類を表示
  43. cat ファイルの中身を表示
  44. head ファイルの先頭部分を表示
  45. wc 行数/単語数/文字数を確認
  46. shutdown システムのシャットダウンと再起動
  47. ps プロセスの確認
  48. which コマンドの絶対パスを調べる
  49. yum RedHat系ディストリビューションの管理
  50. mount ファイルシステムのマウント
  51. 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
  52. 特定のフォルダとそのサブフォルダ内にある特定のファイル名のファイルを再帰的に削除