オフィシャルサイト: welcome home : vim online

vi (vim)

vi は、WINDOWS系エディタから考えると操作方法がかなり異質で、最初は非常に取っつきにくい。しかし、UNIX系OSならまず間違いなく標準装備しているし、コンソールさえ動けばまずたいてい動くので、緊急事態においても強力な味方となる。また、emacs のように保存時に文字コードを勝手にいじくろうとすることもなく、使い方さえ分かればとても「素直」なエディタだ。

このページは、普段使うであろう主要なキー/コマンドのクイックリファレンスとした。同じ機能を持つコマンドが何形式もあるが、それぞれ自分なりに使いやすい1つに絞り、機能的にも「これだけ知っていれば不自由しない」と思われるものだけに絞った。また、とにかく使えることを目的にしているので、vi と vim の区別、モードの区別もしていない。よって、コマンドの様式も敢えてごちゃ混ぜにしている。

「他にこんな機能はないのか?」と思った時にとても調べやすく、しかも広く網羅した使い方ガイドなら vim users guide (日本語) がある。さらに詳細な日本語サイトは KaoriYa.net

キーワード
開く 閉じる 終了 保存 入力開始 移動  
選択 コピー ヤンク カット ペースト 挿入 削除
スクロール マーク 検索 置換 アンドゥ やり直し 繰り返し
タブ インデント 情報表示 連結     その他

開く (通常モード)

複数のファイルを同時に開く

user$ vi file file ...

ファイル間の往き来

次のファイル :ne
直前に開いていたファイル :e #
最初のファイル :rew

開く (vi 上から)

:e file

開く (マルチウィンドウ)

複数のファイルを同時に開く

user$ vi -o file file ...

ファイル間の往き来

次の窓 Ctrl + w Ctrl + w
上の窓 Ctrl + w して上カーソルキー
下の窓 Ctrl + w して下カーソルキー

追加で開く (vi 上から)

:split file

閉じる/終了

終了

:q

強制終了 (変更を破棄)

:q!

保存

保存

:w

強制保存 (モードビット 0400 のファイルを root 権限で編集している時など)

:w!

入力の開始

入力開始 (カーソルの位置から)

i

入力開始 (カーソルの次から)

a

移動

8行目へ

:8

行頭へ (エディタ的)

0

行頭へ (ワープロ的)

g0

行末 (エディタ的)

$

行末 (ワープロ的)

g$

ファイルの先頭行

gg
:1

ファイルの末尾行

G
:$

章の頭へ

[[

章の末へ

]]

画面頭

H

画面末

L

最後に編集した行へ

'[

最後に編集した文字へ

`[

単語単位で次へ移動

w

単語単位で前へ移動

e

対応するカッコ ( { } ( ) など) へ

%

シェルターミナルへ移動

:sh

再び vi へ戻るにはターミナル上で exit

選択

テキストの選択

v してカーソルを移動

行の選択

V してカーソルを移動

ブロック (矩形) 選択

Ctrl + v してカーソルを移動

コピー (vi ではヤンクという)

コピー (選択系コマンドの後に)

y

行コピー

yy

3行をコピー

2y して 上矢印 キーか 下矢印 キー

「ここから下へ4行を」 なら 3y して 下矢印 キー。

カーソル位置から行末までをコピー

y$

カーソル位置から行頭までをコピー

y0

マーク a からマーク b までを文字単位コピー

`ay`b

マーク a からマーク b までを行コピー

'ay'b

単語1つをコピー

yw

単語3つをコピー

3yw

カット

カット (選択系コマンドの後に)

d

行カット

dd

3行をカット

2d して 上矢印 キーか 下矢印 キー

「ここから下へ4行を」 なら 3d して 下矢印 キー。

カーソル位置から行末までをカット

d$

カーソル位置から行頭までをカット

d0

マーク a からマーク b までを文字単位カット

`ad`b

マーク a からマーク b までを行カット

'ad'b

単語1つをカット

dw

単語3つをカット

3dw

ペースト/挿入

カーソルの前にペースト

P

カーソルの後にペースト

p

カーソルの前に新行を挿入して入力開始

O

カーソルの下に新行を挿入して入力開始

o

カーソルの次行に file の内容を挿入

:r file

コマンドの実行結果を挿入

:r! command

例えば、 `:r! date' や `r! echo $((16*1024*1024))' (後の例はシェルがBASHの場合だが)。

複数の行の同じ位置にテキストを挿入

例えば、連続する 4行の行頭に # を挿入してまとめてコメントアウトしたい時など。

最初の行の行頭にカーソルを置いておき、Ctrl + v ->カーソル移動 で矩形選択しておいてから、

ItextEsc

カーソル位置の次の桁にアペンドする場合は、上記コマンドの代わりに、

AtextEsc

削除

文字削除 (または選択系コマンドの後に)

x

カーソル上の文字を削除して入力開始

s

カーソル位置から3文字削除して入力開始

3s

スクロール

半画面ダウン

Ctrl + d

半画面アップ

Ctrl + u

1行ダウン

Ctrl + e

1行アップ

Ctrl + y

カーソル行を画面中央に

zz

マーク

a というマークをセット

ma

複数ファイル編集中にファイル間でマークを共有するには、mA のようにマークに大文字を使う。

マーク a にジャンプ

`a

マーク a のある行へジャンプ

'a

検索

regex (正規表現) については Perl のページを参照のこと。

検索

/regex

vi 上で正規表現特殊文字をちゃんと特殊文字として使うには、バックスラッシュによってエスケープしなくてはならないものと、してはならないものがあり複雑:

| + :要エスケープ
^ $ . * :エスケープ不要
( ) :両方エスケープ
{ } :初めだけエスケープ
[ ] :エスケープ不要

というわけなので、例えば host, hist, histrory, hostory, historic などを探す場合:

/h[oi]\{1}st\(ory\|oric\)*

とコマンドしなければならない。

大文字と小文字を区別せずに検索

/regex\c

この他の検索オプションは、vi 上で :help search-pattern するとヘルプが見られる。

カーソルの乗っている単語と同じものを検索

*

次のマッチへ移動

n

前のマッチへ移動

N

検索によるハイライトを消す

:noh

置換

カーソル位置の次の桁上の1文字を置換

rx

置換 (カーソル行で最初に見つかったマッチだけ)

:s/regex/new_chars/

置換 (カーソル行で見つかったマッチすべて)

:s/regex/new_chars/g

2行目から9行目までで見つかったマッチを置換

:2,9s/regex/new_chars/

g で「すべて」になるのは同様。

マーク a のある行からマーク b の行の中で見つかったマッチを置換

:'a,'bs/regex/new_chars/

範囲内の各行で最初に見つかったマッチだけ置換される。範囲内のすべてのマッチヶ所を置き換えたいなら g を付ける。

カーソル行から文末までで見つかったマッチを置換

:.,$s/regex/new_chars/

文頭からカーソル行までで見つかったマッチを置換

:0,.s/regex/new_chars/

文書内のすべてのマッチを置換

:%s/regex/new_chars/g

なお、範囲を指定しての置換は、 V による選択に続けて実行することも可能。繰り返し方についてはこちら

カーソル上の英文字の大文字/小文字変換

~

複数行の同じ位置の文字列を一度に置換

Ctrl + v カーソル移動 で矩形選択しておいてから、

ctextEsc

アンドゥ (やり直し)

アンドゥ

:u

やり直しのやり直し (WINDOWS系でいうところの Ctrl + y)

Ctrl + r

繰り返し

編集コマンドの繰り返し

.

置換コマンドの繰り返し

&

タブ/インデント

カーソル行のインデントを1段増やす

>>

カーソル行のインデントを1段減らす

<<

タブ/インデント関係の設定

ホームディレクトリにある .exrc (なければ作る) で設定を調整することができる。

表示上のタブ幅を4文字相当に設定

set tabstop=4

>> や << の際のインデント幅を4文字分に設定

set shiftwidth=4

自動インデントを有効にする

set autoindent

情報表示

カーソル行の行番号 (およびその内容)

:nu

編集している文書のファイル名と総行数、変更 [modified] されているか

:file

コマンド履歴 (編集系)

q: 別窓表示
: して上矢印 インライン表示

コマンド履歴 (検索系)

q/ 別窓表示
/ して上矢印 インライン表示

その他

カーソル行を次の行と連結

:j