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

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

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

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

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

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

  • コマンドは連携する。
    • 例 :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⏎(= 行番号を表示する、しない)

便利に使うための操作

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

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