tmp/vi/vi_minimal_cheatsheet_for_me

(たぶん)ほぼ最低限度の vi キー説明

「いつまでたっても覚えられないんだけど、せめてメモ帳と同程度くらいには vi を使えるようになってゆきたい、という人(というか俺)向けの」というようなニュアンスで。

(たぶん)ほぼ最低限度の注意

  • うかつにキーボードを押してはいけない。 vi の標準状態はコマンドモードであり、挿入もしくは上書き入力モード以外では文字をそのまま入力できない。 何か文字を打ち込んでもそのまま入力されずに適当なコマンドが発動してしまう。
  • テキスト入力モードかコマンドモードかわからなくなったら、とりあえず Esc を押せばコマンドモードに戻る。たぶん。
  • 編集内容を破棄して終了 → :q!
  • (拡張のない vi では)Undo は直前の1回だけ。
    「u コマンドのすぐ後にまた u コマンドを打つと直前の取り消しコマンドを取り消す。すなわち元通りに戻る。u コマンドを何度も打つと、変更したテキストと変更していないテキストを交互に得ることになる」(D.ゾンネンシャイン著『UNIXスクリーン・エディタ vi ガイド』p.30)
  • 無理して(?)カーソル移動やページ移動に文字キーを使わなくてもいい。たいていの vi(クローン)実装および端末では、カーソルキーや PageUp/Down はそれらしい動作をするように最初から設定されている。
  • 以下のキーアサインだけでは、vi 独自の比較的パワフル/便利な使い方はほとんどできない(オリジナル vi でサポートされている、最低水準のものですらも)。いや…念のため。
※コロン(:)で始まるもの、検索(/, ?)コマンドは最後に Enter を入力する。
 それ以外のものは最後の文字を入力した時点でコマンドとして動作する。


ファイルを開く
	:e《filename》	《filename》を開く
			(現ファイルの変更分は保存しておく必要がある)
	:e!《filename》	《filename》を開く
			(現ファイルの変更分を保存しない)
	:e #		直前に編集していたファイルを開く
			(# → コマンドで直前に指定されたファイル名を表す)
	Ctrl-^		:e # と同じ


ステータス表示
	Ctrl-g		現在の編集ファイル名と行番号を表示


保存
	:w		保存


終了
	:q		終了(テキスト変更後は終了できない)
	:wq		保存終了
	:q!		非保存終了(変更を破棄)


編集(テキスト入力モードに入る。Esc キーで入力モードから抜ける)
	i		挿入モードに入る(カーソル直前)
	a		挿入モードに入る(カーソル直後)

	I		挿入モードに入る(カーソル行の先頭)
	A		挿入モードに入る(カーソル行の末尾)

	O		行挿入モードに入る(カーソルのある行の前行)
	o		行挿入モードに入る(カーソルのある行の次行)

	R		上書き入力モードに入る


編集(削除)
	x		1文字削除(Delete)
	X		直前の1文字削除(BackSpace)
	J		行末の改行削除(行結合)

	dd		1行削除
	《数値》dd	《数値》行削除


編集(行結合)
	J		行結合


編集(コピー・貼りつけ)
	yy		1行ヤンク(コピー)
	《数値》yy	《数値》行ヤンク

	P		貼りつけ(カーソルのある行の前行に挿入)
	p		貼りつけ(カーソルのある行の次行に挿入)


編集(Undo)
	u		直前の変更を取り消し(Undo)
			(直前の1回分だけ。もう一度 u すると Undo 操作が
			取り消される)
	U		今いる行に対する直前の変更を取り消し
			(いったん別の行に移動すると使えなくなる)


カーソル移動・ページ移動
	h		左
	j		下
	k		上
	l		右

	-		前行の先頭単語へ移動
	+, Enter	次行の先頭単語へ移動

	Ctrl-b		PageUp
	Ctrl-f		PageDown
	Ctrl-u		PageUp(画面半分)
	Ctrl-d		PageDown(画面半分)、一つ前のインデントに戻る

	0		行頭
	$		行末

	H		Home(画面左上)
	L		画面最下行(左下)

	Ctrl-y		1行ロールアップ
	Ctrl-e		1行ロールダウン


カーソル移動(行ジャンプ)
	1G		ファイル先頭行
	《数値》G	ファイルの《数値》行目
	G		ファイル最終行


検索
	/《パターン》	次に出る《パターン》を検索(ファイル終端方向へ)
	?《パターン》	直前にある《パターン》を検索(ファイル先頭方向へ)
	
	n		次を検索(/ ... 終端方向、? ... 先頭方向)
	N		直前を検索(/ ... 先頭方向、? ... 終端方向)


置換
	:s/《検索パターン》/《置換後パターン》/g
			現在の1行内で全置換
	:《開始行》,《終了行》s/《検索パターン》/《置換後パターン》/g
			《開始行》から《終了行》の範囲で全置換
	:%s/《検索パターン》/《置換後パターン》/g
			テキスト全体で全置換(% → 1,$ の略記)
	:%s/《検索パターン》/《置換後パターン》/gc
			テキスト全体で全置換
			(パターンにマッチするたびに問い合わせる)


外部コマンド実行
	:!《コマンド》	外部コマンド実行


全体設定オプション
	:set nu		行番号表示モード(デフォルト :set nonu)
	:set ai		自動インデント(デフォルト :set noai)
	:set sw=《幅》	インデント幅(デフォルト :set sw=8)
	:set ts=《幅》	画面上でのTab幅(デフォルト :set ts=8)
	:set ic		検索時に大文字・小文字を区別しない
			(デフォルト :set noic)
	:set list	タブ、行末を文字表示(デフォルト :set nolist)