2.

viエディタの使い方|モード・基本操作・検索置換・:wqでの保存終了

編集
この記事の要点
  • vi は UNIX 系 OS に標準搭載されたモード型テキストエディタで、ターミナルだけで動作する
  • 主要モードはノーマル(移動・コマンド)/ 挿入(入力)/ コマンドライン(保存・終了・置換)の 3 つ
  • マウスやカーソルキーに依存せず、h j k l と短い命令文で全操作を行う
  • 保存して終了は :wq、保存せず破棄して終了は :q!
  • 実体は多くの環境で Vim(vi の上位互換)にエイリアスされている

vi とは

vi(ヴィーアイ)は UNIX 系 OS にほぼ標準搭載されている、モード型のテキストエディタです。1976 年に Bill Joy 氏が BSD UNIX 用に開発し、現在の Linux や macOS のターミナルでも vi コマンドで起動できます。

マウスやカーソルキー(時には不要)に頼らず、キーボードの英字キーだけでファイル編集を完結させる設計になっており、SSH 越しの最低限のターミナルでも確実に動くのが最大の強みです。

起動と終了

# 新規 or 既存ファイルを開く
vi file.txt

# 終了パターン
:q       # 変更なしで終了
:q!      # 変更を破棄して強制終了
:w       # 保存(書き込み)
:wq      # 保存して終了
:x       # 変更があれば保存して終了(:wq とほぼ同じ)
ZZ       # ノーマルモードで :wq と同じ
ZQ       # ノーマルモードで :q! と同じ

3 つのモード

モード役割入り方
ノーマルモードカーソル移動・コピー・削除・コマンド呼び出し(既定)Esc を押す
挿入モード文字を入力するノーマルから i / a / o
コマンドラインモード保存・終了・置換・シェル実行などノーマルから : / / / ?

vi 操作で初心者が迷う最大の理由が「いまどのモードか分からない」点です。迷ったら Esc を押してノーマルに戻るのが鉄則です。

挿入モードへの入り方

キー動作
iカーソル位置の手前から挿入
aカーソル位置の直後から挿入
I行頭から挿入
A行末から追記
o下に新しい行を作って挿入
O上に新しい行を作って挿入
s1 文字消して挿入

カーソル移動

キー動作
h j k l左 / 下 / 上 / 右
w / b次の単語の先頭 / 前の単語の先頭
0 / $行頭 / 行末
gg / Gファイル先頭 / 末尾
5G5 行目へジャンプ
Ctrl-f / Ctrl-b1 画面進む / 戻る
Ctrl-d / Ctrl-u半画面進む / 戻る

削除・コピー・貼り付け

キー動作
x1 文字削除
dd1 行削除(同時にヤンク)
5dd5 行まとめて削除
dw単語を削除
d$行末まで削除
yy1 行ヤンク(コピー)
5yy5 行ヤンク
p / Pカーソル後 / 前にペースト
uアンドゥ
Ctrl-rリドゥ

検索と置換

/foo           foo を前方検索(n で次、N で前)
?foo           foo を後方検索
:%s/foo/bar/g  ファイル全体で foo を bar に置換
:%s/foo/bar/gc 確認しながら置換
:1,10s/foo/bar/g  1〜10 行目だけ置換

保存と終了の使い分け

状況コマンド
編集を反映して終了:wq または ZZ
変更を捨てて終了:q! または ZQ
別名で保存:w newfile.txt
読み込み専用で開いたまま保存したい:w !sudo tee %(権限不足時の裏ワザ)

vi と Vim の関係

現在の多くの Linux ディストリビューションでは、vi を実行すると実体としては Vim(Vi IMproved)が起動します。Vim は vi の互換上位で、シンタックスハイライト・複数バッファ・プラグイン・分割ウィンドウなどの機能が追加されています。

名称特徴
vi(オリジナル)BSD 由来のシンプル版。POSIX 互換
nviBSD 系の vi 再実装
Vim事実上の標準。シンタックスハイライト / プラグイン
NeovimVim をリファクタしたモダン版(Lua 拡張)

初期設定(~/.vimrc)

vi が Vim にエイリアスされている環境なら、ホームディレクトリに .vimrc を作ると起動時に読み込まれます。

" 行番号表示
set number

" シンタックスハイライト
syntax on

" タブをスペース 4 個に
set tabstop=4
set shiftwidth=4
set expandtab

" 検索結果のハイライト
set hlsearch

" 大文字小文字を区別しない(ただし大文字を含むと区別)
set ignorecase
set smartcase

よくあるトラブル

症状対処
vi から抜けられないEsc:q!(保存しない)または :wq(保存)
swap file 既に存在」と言われる別プロセスが開いている / 前回クラッシュ。安全なら D(delete)で消す
「Permission denied」で保存できない:w !sudo tee % で sudo 権限で書き込み
矢印キーで abcd が入る古い vi の互換モード。set nocompatible.vimrc に入れる

覚えておきたい便利コマンド集

キー / コマンド動作
:set number行番号表示(解除は :set nonumber
:set pasteターミナルからのペースト時にインデント崩れを防止
:syntax onシンタックスハイライトを有効化
gg=Gファイル全体を自動インデント
:%!sort外部コマンド sort でバッファ全体をフィルタ
:e!編集中のファイルを保存せずに再読み込み
:r filenameカーソル位置に別ファイルを挿入
:r !dateシェルコマンドの結果を挿入
v / V / Ctrl-v文字 / 行 / 矩形のビジュアル選択
.(ドット)直前の操作を繰り返す

マークとジャンプ

編集位置に「しおり」を付けて素早く戻れます。

ma      位置 a としてマーク
'a      マーク a の行頭に移動
`a      マーク a の正確な位置に移動
''      直前のジャンプ元へ戻る
Ctrl-o  ジャンプリストを戻る
Ctrl-i  ジャンプリストを進む

関連

編集
Post Share
子ページ
  1. 行数を表示する方法
同階層のページ
  1. CKEditor
  2. vi

最近更新/作成されたページ