Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

2012-02-29

全部覚えたいviの使い方

前回、なるべく覚えないで使えるようになろう!と模索していたが、やっているうちに全部覚えたくなってしまった...。viおよびvimは、とてつもないポテンシャルを備えていることを、調べるほどにひしひしと感じる。viの魔力にハマった感じ。しかし、とてもじゃないが全部網羅できない...。

#### この表の用例
	esc		= escキー
	⏎ 		= enterキー
	space		= スペースキー
	tab		= tabキー
	delete		= deleteキー
	ctrl-x		= controlキーを押しながら x を押す
	option-x	= optionキーを押しながら x を押す
	command-x	= commandキーを押しながら x を押す
	fn-x		= fnキーを押しながら x を押す
	A・B		= 「AあるいはB」の意味。似た機能を1行で併記する時に使う
#### viの起動
	vi		名称未設定ファイルを開く
	vi ファイル	ファイルを開く
	vi -r ファイル	強制終了後のバックアップから、ファイルを復元して開く
#### モード
	i・a		カーソルの左・右に、挿入モードで入力する
	I・A		行頭・行末に移動して、挿入モードで入力する
	O・o		上・下に1行追加して、挿入モードで入力する
	s		1文字削除して、挿入モードへ移行する
	R		置換モードで入力する
	esc		コマンドモードへ移行する
#### 保存・終了
−-短縮----コマンド---------意味--
	:w⏎		保存する
	:w 別名⏎		別名で保存する(既存のファイルを上書きできない)
	:w! 別名⏎	別名で強制的に保存する(既存のファイルを上書きする)
	:q⏎		終了する(保存してない状態では終了できない)
ZQ	:q!⏎		強制的に終了する(保存してない状態でも終了する)
	:wq⏎		保存して、終了する(変更がなくても保存する)
ZZ	:x⏎		保存して、終了する(変更が無しなら保存せず、終了のみ)
#### カーソル移動
	h・j・k・l	←・↓・↑・→
	w・e・b		カーソルを単語単位で移動する(次の先頭・次の末尾・前の先頭)
	W・E・B		カーソルを空白(= spaceやtab)区切り単位で移動する(次の先頭・次の末尾・前の先頭)
	0・$		カーソルを行頭・行末へ移動する
	^・g_		カーソルを空白以外の行頭・行末へ移動する
	%		カーソルを対応する括弧に移動する(カーソルが括弧の上にある場合)
	-・↵		カーソルを空白以外の一つ上の行頭・一つ下の行頭へ移動する
	{・}		カーソルを「空行」区切りで移動する
	(・)		カーソルを「空行」か「ピリオド& スペース」区切りで移動する
	[[・]]		カーソルを「行頭の{」区切りで移動する
	ctrl-b・ctrl-f	カーソルを1ページ上・下に移動する
	ctrl-u・ctrl-d	カーソルを半ページ上・下に移動する
	H・M・L		カーソルを画面(表示領域内)の上・中央・下へ移動する
	nH・nL		カーソルを画面(表示領域内)の上からn行目・下からn行目へ移動する(n=数字)
	gg・G		カーソルをファイルの先頭・末尾へ移動する
	行番号G		カーソルを行番号へ移動する
	n%		カーソルをファイルの n% の位置へ移動する(n=数字)
	zt・zz・zb	現在のカーソル位置が画面の上・中央・下になるようにスクロールする
 
 ------- ファイル内・ページ内のカーソル移動のイメージ
 1g 0%      gg
 2g              ctrl-b
 3g       --H--          zt スクロール
 4g      | 2H  | ctrl-u 
 5g 50%  |  M  |         zz スクロール
 6g      | 2L  | ctrl-d
 7g       --L--          zb スクロール
 8g              ctrl-f
 9g 100%    G

 ------- w・e・b・W・E・B を体感する
 wXXXXe, wXXXXe. wXXXXe/ wXXXXe -wXXXXe
 bXXXXe (bXXXXe) bXXXXe [bXXXXe] bXXXXe
 日本語の場合は、入力システムの 単語 区切りとなる。
 W・E・B はあくまでも空白区切り単位
 WxxxxE WxxxxE WxxxxE	WxxxxE WxxxxE
 BxxxxE BxxxxE BxxxxE	BxxxxE BxxxxE
 
 ------- 0・^・g_・$ を体感する
         This is a pen.
 0       ^            g_        $
 
 ------- % を体感する
 { 2× (( 3+4 ) +6/3 ) } = [ 括弧のある計算 ]
 
 ------- }・)・]] を体感する
 { This is a pen.This is a pen.This is a pen.}
 ( This is a pen. This is a pen. This is a pen.)
 { This is a pen.This is a pen.This is a pen.}
 
 { This is a pen.This is a pen.This is a pen.}
 ( This is a pen. This is a pen. This is a pen.)
 { This is a pen.This is a pen.This is a pen.}
#### 削除・コピー・ペースト・インデント
	delete		コマンドモード:カーソルを移動(back move)、入力モード:1文字削除(back delete)
	fn-delete	コマンドモード:1文字削除(forward delete)、入力モード:1文字削除(forward delete)
	x・X		1文字削除 = d→・d←
	d カーソル移動	カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字を削除
	dd		1行削除
	D		行末まで削除
	c カーソル移動	カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字を削除、挿入モードへ移行
	cc		1行カット、挿入モードへ移行
	C		行末までカット、挿入モードへ移行
	y カーソル移動	カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字をコピー
	yy		1行コピー
	Y		1行コピー
	P・p		カーソルの上左・下右にペースト(削除・コピー・カットしたテキストがペースト可能)
	>>・<<・==	カーソル行のインデントレベルを上げる・下げる・自動設定(行頭のタブを追加する・削除する)
#### 領域選択との組み合せ
	v		文字選択を開始する(カーソル移動して範囲を動かす、キャンセルは esc または もう一度v)
	V		行選択を開始する(カーソル移動して範囲を動かす、キャンセルは esc または もう一度V)
	ctrl-v		矩形(長方形)選択を開始する(カーソル移動して範囲を動かす、キャンセルは esc または もう一度ctrl-v)
	gv		前回選択した範囲をもう一度選択する
	d		選択した範囲を削除
	c		選択した範囲を削除、挿入モードへ移行
	y		選択した範囲をコピー
	>・<・=		選択範囲のインデントレベルを上げる・下げる・自動設定(行頭のタブを追加する・削除する)
	:s/A/B/g	選択した各行に対して、すべての A を B に置き換える(:後、'<,'>に続けて、s/A/B/gと入力する)
	:w 別名		選択範囲のテキストを、別名で保存する(:後、'<,'>に続けて、w 別名と入力する)
	"xy		選択範囲のテキストを、xレジスタに保存する
#### クォート・カッコ内の領域選択
     例 {(("['xAxx']"))} において、カーソル位置が A でvix・vaxした時の選択範囲
	vi' ・va'	xxxx		・'xxxx'
	vi] ・va]	'xxxx'		・['xxxx']
	vi" ・va"	['xxxx']	・"['xxxx']"
	vi) ・va)	"['xxxx']"	・("['xxxx']")
	v2i)・v2a)	("['xxxx']")	・(("['xxxx']"))
	vi} ・va}	(("['xxxx']"))	・{(("['xxxx']"))}
     つまり、囲い文字を viは含まず・vaは含む その内側を選択する
#### 選択領域の各行の先頭・末尾に挿入する
     例
	XXXX		ブロックエリア
	XXXX		ブロックエリア
	XXXX		ブロックエリア
     ctrl-v で ブロックエリア 部分を矩形(長方形)選択する
     I を入力する
     1行目の先頭に #### を入力して esc
     各行が ####ブロックエリア となる
	I・A		選択した領域の各行の先頭・末尾に挿入する
#### マウス
	ドラッグ		範囲選択
	option-ドラッグ	矩形選択
	command-c	コピー(コマンドモードのコピーは保持される)
	command-v	ペースト
	option-クリック	クリック行に移動する
#### 取り消し・繰り返し
−-短縮----コマンド---------意味--
	u		操作履歴を一つ前に戻す(undo)
ctrl-r	:redo⏎		操作履歴を一つ次に進める(redo)
	.		直前の操作を繰り返す
	数字 コマンド	数字を付加してコマンドを指定すると、その回数繰り返す
	例 10l		lを10回実行 = 10文字右へ移動 
	例 4dd		ddを4回実行 = 4行削除
	例 3x		xを3回実行 = 3文字削除
	例 2u		uを2回実行 = 操作履歴を2つ前に戻す
#### 検索
	*		カーソル位置の単語を、文章末尾へ向かって、検索する
	#		カーソル位置の単語を、文章先頭へ向かって、検索する
	/ キーワード	キーワード(正規表現も使える)を、文章末尾へ向かって、検索する
	? キーワード	キーワード(正規表現も使える)を、文章先頭へ向かって、検索する
	n・N		次の検索キーワードへ・前の検索キーワードへ
	fx・Fx		行内で、行末・行頭に向かって x 1文字を検索する、x 上にカーソルをセットする(行内1文字検索)
	tx・Tx		行内で、行末・行頭に向かって x 1文字を検索する、x の直前にカーソルをセットする(行内1文字検索)
	;・,		行内1文字検索で、次の検索文字へ・前の検索文字へ
#### 置き換え(Aには正規表現も使える)
	:s/A/B/⏎	カーソル行に対して、最初の A を B に置き換える
	:s/A/B/g⏎	カーソル行に対して、すべての A を B に置き換える
	:s/A/B/gc⏎	カーソル行に対して、すべての A を B に確認してから置き換える
	:%s/A/B/⏎	すべての各行に対して、最初の A を B に置き換える
	:%s/A/B/g⏎	すべての各行に対して、すべての A を B に置き換える
	:60,63s/A/B/g⏎	60から63行に対して、すべての A を B に置き換える
	:60,$s/A/B/g⏎	60から最終行に対して、すべての A を B に置き換える
	~		カーソル位置の大文字と小文字を変換する
	rx		カーソル位置を x に修正する(x = 1文字のテキスト)
	J・gj		次の行と連結する(スペース区切りあり・無し)
#### マーク
	mマーク		カーソル位置にマーク(A-Za-zの1文字のラベル)を付ける
	'マーク		マークした位置に移動する
	:marks⏎		マークの一覧を表示する
#### 折りたたみ
	zf		選択行を折りたたむ
	space		折りたたみを展開する
#### ウィンドウ
	:split⏎		画面を水平に分割する
	:vsplit⏎	画面を垂直に分割する
	:new パス⏎	画面を水平分割して、パスのファイルを開く
	:vnew パス⏎	画面を垂直分割して、パスのファイルを開く
	:e パス⏎		現在の分割領域に、パスのファイルを開く
	:close⏎		分割領域を閉じる
	ctrl-w w	別の分割領域へ移動する
	ctrl-w +	分割領域を拡大する
	ctrl-w -	分割領域を縮小する
	ctrl-w r	分割領域を上下逆・左右逆にする
#### オプション設定
	:set all⏎	すべてのオプション設定を表示する(q=終了、space・b=1ページ移動、d・u=半ページ移動)
	:set tabstop=8⏎	タブ幅を8文字に設定する
	:set number⏎	行番号を表示する
	:set nonumber⏎	行番号を表示しない
#### 略記
	:ab mb MacBook⏎	mb tab で MacBook と入力するように設定する
	:unab mb⏎	略記 mb を解除する
	:ab⏎		略記設定を一覧表示する
#### 補完
	ctrl-p		入力モードにおいて、ファイル内で繰り返し使われる単語を補完する
     例 list1 list2 list3 日本国憲法 日本史
	li ctrl-p	list1 list2 list3 の選択候補が表示される
	日本ctrl-p	日本国憲法 日本史 の選択候補が表示される
#### マクロ(= キー操作の手順)
     例 
	# コメント行
	# コメント行
	# コメント行
	# コメント行
     1行目の # にカーソルを移動
     qa と入力して、マクロ記録を開始(aレジスタに保存される、レジスタはa-zの任意の1文字)
     xx と入力して、1行目の'# 'を削除
     ↓を押して2行目の # に移動
     q と入力して、マクロ記録を終了
     @a と入力して、aレジスタのマクロを実行
     2@a と入力すると、aレジスタのマクロを2回実行する
	qx・q		マクロ記録を開始(xレジスタに保存される)・もう一度 q を押してマクロ記録を終了		
	@x		xレジスタのマクロを実行する
	@@		直前に実行したマクロを実行する
#### レジスタ読み書き
	:reg⏎		レジスタ情報をリスト表示
	"xp		xレジスタの値をカーソル位置にペースト(レジスタ = a-zの1文字)
	"xyy		xレジスタにカーソル行のテキストをコピー(レジスタ = a-zの1文字)
	領域選択と"xy	xレジスタに選択範囲のテキストをコピー(レジスタ = a-zの1文字)
     レジスタにはマクロだけでなく、テキストの書込・読出が可能
     つまり、26個のクリップボードのように扱えるのだ
#### その他
−-短縮----コマンド---------意味--
	:r パス⏎		パスのファイル内容を挿入する
	:r! コマンド⏎	コマンドの実行結果を1行挿入する
!!	:.! コマンド⏎	コマンドの実行結果で1行置き換え
	:args⏎		ファイル名を一覧表示する
	:pwd⏎		カレントディレクトリを表示する
	ctrl-g		ファイル名・変更状態・カーソル位置などを表示する
	q:		:で始まるコマンド履歴を表示する(選択して実行可能)
	ctrl-a		カーソル下の数値に +1 する

経験とか、悩みとか、

  • GUI環境とショートカットが重複していると、viの操作が反応しないことがある。
    • viのcontrol-rが、Quicksilverの設定と重複していて反応してくれなかった。
    • Quicksilverの設定を変更したら、ちゃんと反応した。
  • 日本語使っていると、コマンドモードで「かな」のまま入力してしまったがっかり感は相当なもの。(どうにかしたいと悩む)

さらに、何を覚えるべきか?(きりがない)

参考ページ

素晴らしい情報に感謝です!

2012-02-27

なるべく覚えないviエディタの使い方

viというエディタがある。長い歴史のあるエディタである。ユーザー視点で見ると、コマンドモード・入力モードという二つのモードがあって、モードを切り替えながらテキスト編集するスタイルである。GUI全盛のモードレスなエディタに慣れきってしまった自分には、かなり面食らったエディタであった。初めて起動した時、文字も入力できず、終了の仕方も分からない...。何じゃこれは?

そう思って調べてみると、viには非常に多くのショートカット的コマンドがある。その多さにまず面食らう。とても覚えきれないと。以下は、自分で調べて理解できた使い方である。軽く100以上の操作がある。(これでもなるべく行を節約して書いたのに)しかも、以下の表でもすべてを網羅できている訳ではない。

どうにか、これらのコマンドをなるべく覚えないで、そこそこ使えるようになりたい。何を覚えて、何を覚えなくていいのか、探ってみた。

viエディタの使い方(多過ぎて覚えられない例)

1表記についてこの表で使われる書き方の意味
2esc= escキー
3= enterキー
4space= スペースキー
5tab= tabキー
6ctrl-x= controlキーを押しながら x を押す
7option-x= optionキーを押しながら x を押す
8command-x= commandキーを押しながら x を押す
9A・B= 「A あるいは B」の意味。似た機能を1行で併記する時に使う
10
11viの起動
12vi名称未設定ファイルを開く
13vi ファイルファイルを開く
14vi -r ファイル強制終了後のバックアップから、ファイルを復元して開く
15
16モード
17i・aカーソルの左・右に、挿入モードで入力する
18I・A行頭・行末に移動して、挿入モードで入力する
19O・o上・下に1行追加して、挿入モードで入力する
20s1文字削除して、挿入モードへ移行する
21R置換モードで入力する
22escコマンドモードへ移行する
23
24保存・終了
25:w⏎保存する
26:w 別名⏎別名で保存する
27:q⏎終了する(保存してない状態では終了できない)
28:q!⏎保存せずに終了する
29:wq⏎必ず、保存して終了する
30:x⏎変更があれば、保存して終了する(変更無しなら、保存せず終了のみ)
31ZZ= :x⏎
32
33カーソル移動
34h・j・k・l←・↓・↑・→
35w・e・bカーソルを単語単位で移動する(次の先頭・次の末尾・前の先頭)
36W・E・Bカーソルをスペース区切り単位で移動する(次の先頭・次の末尾・前の先頭)
370・^・$カーソルを行頭・空白以外の行頭・行末へ移動する
38次の行の先頭へ移動する
39{・}「空行」区切りで移動する
40(・)「空行」か「ピリオド& スペース」区切りで移動する
41[ [・] ]「{」区切りで移動する
42ctrl-f・ctrl-b1ページ上・下に移動する
43ctrl-u・ctrl-d半ページ上・下に移動する
44H・M・L画面(表示領域)の上・中央・下へ移動する
45gg・Gファイルの先頭・末尾へ移動する
46行番号 G行番号へ移動する
47zzカーソル位置が中央になるようにスクロールする
48
49削除・コピー
ペースト・インデント
50x・X= d→・d←
51d カーソル移動カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字を削除
52dd1行削除
53D行末まで削除
54c カーソル移動カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字を削除、挿入モードへ移行
55cc1行削除、挿入モードへ移行
56C行末まで削除、挿入モードへ移行
57y カーソル移動カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字をコピー
58yy1行コピー
59Y1行コピー
60v範囲選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度v or esc)
61V行選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度V or esc)
62ctrl-v矩形選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度ctrl-v or esc)
63gv前回選択した範囲をもう一度選択する
64d選択した範囲を削除
65c選択した範囲を削除、挿入モードへ移行
66y選択した範囲をコピー
67P・pカーソルの上左・下右にペースト(削除・コピー・カットしたテキストがペースト可能)
68選択範囲のインデントを上の行に合わせる
69
70マウス
71ドラッグ範囲選択
72option-ドラッグ矩形選択
73command-cマウスで選択した範囲をコピー(コマンドモードのコピーは保持される)
74command-vcommand-cに対するペースト
75option-クリッククリック行に移動する
76
77取り消し・繰り返し
78u操作履歴を一つ前に戻す(undo)
79:redo⏎・ctrl-r操作履歴を一つ次に進める(redo)
80.直前の操作を繰り返す
81数字 コマンド数字を付加してコマンドを指定すると、その回数繰り返す
82例 10llを10回実行 = 10文字右へ移動
83例 4ddddを4回実行 = 4行削除
84例 3xxを3回実行 = 3文字削除
85例 2uuを2回実行 = 操作履歴を2つ前に戻す
86
87検索
88カーソル位置の単語を、文章末尾へ向かって、検索する
89#カーソル位置の単語を、文章先頭へ向かって、検索する
90/ キーワードキーワード(正規表現も使える)を、文章末尾へ向かって、検索する
91? キーワードキーワード(正規表現も使える)を、文章先頭へ向かって、検索する
92n・N次の検索キーワードへ・前の検索キーワードへ
93
94置き換え(Aには正規表現も使える)
95:s/A/B/⏎カーソル行に対して、最初の A を B に置き換える
96:s/A/B/gカーソル行に対して、すべての A を B に置き換える
97:s/A/B/gc⏎カーソル行に対して、すべての A を B に確認してから置き換える
98:%s/A/B/g⏎ファイル全体に対して、すべての A を B に置き換える
99:60,63s/A/B/g⏎60から63行に対して、すべての A を B に置き換える
100:60,$s/A/B/g⏎60から最終行に対して、すべての A を B に置き換える
101~カーソル位置の大文字と小文字を変換する
102rxカーソル位置を x に修正する(x = 1文字のテキスト)
103J次の行と連結する
104
105マーク
106mマークカーソル位置にマーク(A-Za-zの1文字のラベル)を付ける
107マークマークした位置に移動する
108:marksマークの一覧を表示する
109
110折りたたみ
111zf選択行を折りたたむ
112space折りたたみを展開する
113
114ウィンドウ
115:split⏎画面を水平に分割する
116:vsplit⏎画面を垂直に分割する
117:new パス画面を水平分割して、パスのファイルを開く
118:vnew パス画面を垂直分割して、パスのファイルを開く
119:e パス現在の分割領域に、パスのファイルを開く
120:close⏎分割領域を閉じる
121ctrl-w w別の分割領域へ移動する
122ctrl-w +分割領域を拡大する
123ctrl-w -分割領域を縮小する
124ctrl-w r分割領域を上下逆・左右逆にする
125
126環境設定
127:set all⏎すべての環境設定を表示する(q=終了、space・b=1ページ移動、d・u=半ページ移動)
128:set tabstop=8⏎タブ幅を8文字に設定する
129:set number⏎行番号を表示する
130:set nonumber⏎行番号を表示しない
131
132略記
133:ab mb MacBookmb tab で MacBook と入力するように設定する
134:unab mb⏎略記 mb を解除する
135:ab略記設定を一覧表示する
136
137その他
138:r パス⏎パスのファイル内容を挿入する
139:r! コマンド⏎コマンドの実行結果を1行挿入する
140:.! コマンド⏎コマンドの実行結果で1行置き換え
141!!= :.!
142:args⏎ファイル名を一覧表示する
143:pwd⏎カレントディレクトリを表示する
144ctrl-gファイル名・変更状態・カーソル位置などを表示する

必要最小限の7つの操作

今時のviは、矢印キーも使える。マウスで選択すればコピー・ペーストも可能である。日本語もデフォルト設定のまま問題なく入力できた。

ならば、必要最小の知識として、以下のことを知っていれば、どうにかなりそうな気がした。

  • viエディタには、コマンドモードと入力モードがあるよ。
  • vi起動直後は、コマンドモードになっているよ。
  • 文字入力は、入力モードの時しかできないよ。
  • コマンドモードで i を入力すると、入力モードに移行するよ。
  • escキーを押せば、コマンドモードに戻るよ。
  • コマンドモードで Z Z と押すと、ファイルを保存して終了するよ。
  • コマンドモードで : q ! enter と押すと、保存せずに終了するよ。

どのように覚えるか?

それにしても、必要最小の知識だけでは使いにくい。行全体をコピーしたいとか、行頭・行末に移動したいとか、文頭・文末に移動したいとか、そんな時でもカーソルが1文字1行ずつしか動かないのでイライラすること必至である。

ある程度のコマンドは覚える必要がある。しかし、丸暗記していると膨大なコマンド数に感じてしまう。コマンドの仕組みを理解して、少ない知識で最大の効果をあげるにはどのように覚えるべきなのか?考えてみた。

  • 入力モードに移行するのは、最初は i だけ覚えておけば十分。
    • 必要に応じて、その他の移行方法は覚えればいい。(個人的にはo・Oをよく使う)
  • 異なる操作だが、同じ機能を実現する場合がある。やり易い方法を一つだけ覚えておけば十分。
    • 大抵、短縮エイリアス的なコマンドの方が使い易いので、そちらを優先している。
    • 例 :x = ZZ = 変更があれば保存して、終了 ...... ZZが好みなので、これだけ覚えた。
    • 例 d→・d← = x・X = fn-delete・delete = 1文字削除 ...... つまり、忘れても入力モードでGUI環境と同等にdeleteキーが使えるので、覚えなくてもOK。
  • カーソル移動は矢印キーで十分。無理にhjklを使う必要はない。
    • 但し、hjkl以外のカーソル移動の方法は、できるだけ覚えた方がいい。
  • カーソル移動は重要!
    • カーソルを入力したい箇所に素早く動かせることは、そのままエディタの使い易さに繋がる。
    • 単語、行頭・行末、文頭・文末、ページ移動などは当然として、それ以上にきめ細かく制御できる。
    • カーソル移動だけは、頑張ってしっかり覚えた方がいい。

33カーソル移動
35w・e・bカーソルを単語単位で移動する(次の先頭・次の末尾・前の先頭)
36W・E・Bカーソルをスペース区切り単位で移動する(次の先頭・次の末尾・前の先頭)
370・^・$カーソルを行頭・空白以外の行頭・行末へ移動する
38次の行の先頭へ移動する
39{・}「空行」区切りで移動する
40(・)「空行」か「ピリオド& スペース」区切りで移動する
41[ [・] ]「{」区切りで移動する
42ctrl-f・ctrl-b1ページ上・下に移動する
43ctrl-u・ctrl-d半ページ上・下に移動する
44H・M・L画面(表示領域)の上・中央・下へ移動する
45gg・Gファイルの先頭・末尾へ移動する
46行番号 G行番号へ移動する
47zzカーソル位置が中央になるようにスクロールする

  • コマンドは連携する。
    • 例 :w = 保存、:q = 終了、:wq = 保存して終了
  • そして、カーソル移動もコマンド。よって連携する。
    • 例 w = 1単語ずつ移動、dw = 1単語ずつ削除する
    • 例 0(ゼロ) = 行頭へ移動、d0 = カーソル位置から行頭まで削除する
  • つまり、カーソル移動する範囲を○○する、というルールになっているのだ。
    • これを d、y、c等と連携させると、かなり強力に編集できる。
    • カーソル移動だけしっかり覚えておけば、あとは連携させるだけでOK。
  • c(=change=変更)とd(=delete=削除)の差は、入力モードに移行するか、しないかの差でしかない。
    • つまり、c=d+i である。
    • dだけ覚えておけば十分である。
    • 個人的には、モード移行しない d が使い易い。
  • c・d = OSX環境の command-x カット と同等。
    • つまり、コピー y と同じように、削除したテキストはペーストできるのだ。
  • 2連文字コマンド、大文字コマンド(つまりshiftと英字)は、マウス環境におけるダブルクリック、shift-クリックのような効果がある。
    • 1文字の時より作用する範囲が拡大したり、反対向きに作用したりする。
    • 例 d→ = 1文字削除、dd = 1行削除、D = カーソルから行末まで削除
    • 例 x = 右方向の1文字削除(=forward delete)、X = 左方向の1文字削除(=back delete)
    • 例 p = 下右方向にペースト、P = 上左方向にペースト
  • undo・redoは必ず覚える
    • 操作履歴を一つ前に戻せるu(= undo = OSX環境におけるcommand-z)は素晴らしく便利。
    • と同時に、紹介される機会が少ない :redo⏎ も覚えておくと、幸せ感が倍増される。
  • コマンドの前に数字を付けると、その回数分繰り返す。
    • 例 10→ →を10回実行 = 10文字右へ移動
    • 例 4dd ddを4回実行 = 4行削除
    • 例 3x xを3回実行 = 3文字削除
    • 例 2u uを2回実行 = 操作履歴を2つ前に戻す
  • 検索・置換まで覚えれば、一般的なGUI環境のエディタと同等に使える。
    • 正規表現*1を覚えれば、便利さが飛躍的に向上する。
  • 環境設定は:set all⏎で一覧表示されるので、設定の書式だけ覚えておけば、必要に応じて調べられる。
    • 値は = に続けて設定する。
      • 例 :set tabstop=8⏎(= タブ幅を8文字に設定する)
    • false・trueは、設定項目の先頭にnoを付加するか、しないか
      • 例 :set number⏎、:set nonumber⏎(= 行番号を表示する、しない)

便利に使うための操作

以上のことを考慮して、覚えるコマンドを厳選してみた。

11viの起動
13vi ファイルファイルを開く
14vi -r ファイル強制終了後のバックアップから、ファイルを復元して開く
15
16モード
17i挿入モードで入力する
19O・o上・下に1行追加して、挿入モードで入力する
22escコマンドモードへ移行する
23
24保存・終了
25:w⏎保存する
28:q!⏎保存せずに終了する
31ZZ変更があれば、保存して終了する(変更無しなら、保存せず終了のみ)
32
33カーソル移動
35w・e・bカーソルを単語単位で移動する(次の先頭・次の末尾・前の先頭)
36W・E・Bカーソルをスペース区切り単位で移動する(次の先頭・次の末尾・前の先頭)
370・^・$カーソルを行頭・空白以外の行頭・行末へ移動する
38次の行の先頭へ移動する
39{・}「空行」区切りで移動する
40(・)「空行」か「ピリオド& スペース」区切りで移動する
41[ [・] ]「{」区切りで移動する
42ctrl-f・ctrl-b1ページ上・下に移動する
43ctrl-u・ctrl-d半ページ上・下に移動する
44H・M・L画面(表示領域)の上・中央・下へ移動する
45gg・Gファイルの先頭・末尾へ移動する
46行番号 G行番号へ移動する
47zzカーソル位置が中央になるようにスクロールする
48
49削除・コピー
ペースト・インデント
54d カーソル移動カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字を削除
55dd1行削除
56D行末まで削除
57y カーソル移動カーソル移動(←・↓・↑・→・w・e・b・0・^・$等)した部分の文字をコピー
58yy1行コピー
59Y1行コピー
60v範囲選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度v or esc)
61V行選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度V or esc)
62ctrl-v矩形選択を開始する(カーソル移動して範囲を動かす、キャンセルはもう一度ctrl-v or esc)
63gv前回選択した範囲をもう一度選択する
66y選択した範囲をコピー
67P・pカーソルの上左・下右にペースト(削除・コピー・カットしたテキストがペースト可能)
68選択範囲のインデントを上の行に合わせる
69
70マウス
71ドラッグ範囲選択
72option-ドラッグ矩形選択
73command-cマウスで選択した範囲をコピー(コマンドモードのコピーは保持される)
74command-vcommand-cに対するペースト
75option-クリッククリック行に移動する
76
77取り消し・繰り返し
78u操作履歴を一つ前に戻す(undo)
79ctrl-r操作履歴を一つ次に進める(redo)
80.直前の操作を繰り返す
81数字 コマンド数字を付加してコマンドを指定すると、その回数繰り返す
82例 10llを10回実行 = 10文字右へ移動
83例 4ddddを4回実行 = 4行削除
84例 3xxを3回実行 = 3文字削除
85例 2uuを2回実行 = 操作履歴を2つ前に戻す
86
87検索
88カーソル位置の単語を、文章末尾へ向かって、検索する
89#カーソル位置の単語を、文章先頭へ向かって、検索する
90/ キーワードキーワード(正規表現も使える)を、文章末尾へ向かって、検索する
91? キーワードキーワード(正規表現も使える)を、文章先頭へ向かって、検索する
92n・N次の検索キーワードへ・前の検索キーワードへ
93
94置き換え(Aには正規表現も使える)
98:%s/A/B/g⏎ファイル全体に対して、すべての A を B に置き換える
125
126環境設定
127:set all⏎すべての環境設定を表示する(q=終了、space・b=1ページ移動、d・u=半ページ移動)
128:set tabstop=8⏎タブ幅を8文字に設定する
129:set number⏎行番号を表示する
130:set nonumber⏎行番号を表示しない

全部で50コマンドくらい。これでも多いか...。

参考ページ

歴史

後にカリフォルニア大学バークレイ校にadm3a端末が導入されたのを機に、ビル・ジョイ自身により更なる改良を加えられたものが、現在のviと呼ばれるエディタである。

vi - Wikipedia

上記を読んで想像すると、おそらく、1978年頃からviエディタは活躍していたことになる。それは未だに廃れることなく、UNIXの中には必ず入っている。もちろん、OSXもUNIXなのでviは標準インストールされている。*2

*1:正規表現もまた相当奥の深い知識なのだが、ワイルドカード・行頭・行末ぐらい覚えておくだけでも、かなり便利だと思う。

*2:但し正確には、OSX 10.6のviは、vimへのハードリンクになっている。vimは、今ではviを拡張した上位互換のエディタとなっている。よって、viの操作性は30年以上たった今も、しっかり残っているのである。