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