全部覚えたい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の設定を変更したら、ちゃんと反応した。
  • 日本語使っていると、コマンドモードで「かな」のまま入力してしまったがっかり感は相当なもの。(どうにかしたいと悩む)


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