タイトル: vi テキストディタの使用
SEOタイトル: vi / Vim テキストエディタ完全ガイド (モード / 移動 / 検索置換)
| この記事の要点 |
|
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 / o | Esc |
| Visual | 範囲選択 | v / V / Ctrl+v | Esc |
| 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 | 上に空行を作って入力 |
s | 1 文字削除して入力 |
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 <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
Vim vs Neovim
| 観点 | Vim | Neovim |
|---|---|---|
| 初リリース | 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 <Esc>
Q: 終了の仕方が分からなくて困った
A: Esc → :q! Enter。変更を捨てて強制終了。「Vim から抜け方」は世界で年間 100 万人が検索する問題です。
Q: Vim と Emacs どちらを学ぶべき?
A: SSH 先サーバでも使える Vim 優先。Emacs は独自の世界 (Org-mode 等) で深い。両刀使いも可。
Q: VS Code から Vim に乗り換えるべき?
A: 乗り換えではなく VS Code に Vim 拡張が最強。両方の良いとこ取り。