注釈つき vi コマンドリファレンス
vi のコマンドモードの各コマンドに対して、筆者の独断と偏見に基づいた注釈
を加えながら機能を記述したクイックリファレンスである。
おまけとして nvi のヘルプをもとに Emacs 風のコマンド名もつけてみた。
- a (append-after-cursor)
- カーソルの後ろから挿入を開始する。もし a と A がなかったら、行末に文字を挿入することができない。
- b (move-back-word)
- 前の単語へ移動。h, l では行の終端を越えられないのに、w, b は越えてしまう。この1点をとってもすでに vi の設計が一貫していないことがわかる。
- c (change-to-motion)
- 変更。もっとも有用なコマンドの1つ。しかし実は挙動に例外の多い問題児。なぜ連続する空白の上で cw すると1文字しか削除されないのか?
- d (delete-to-motion)
- 削除。vi は削除に関しては極めて強力である。
- e (move-to-end-of-word)
- 単語の末尾へ移動。単語の末尾へ移動したいのは、大抵末尾に文字を追加したいときだからという理由で :map e ea とする人もいる。参照:UNIX Power Toolsの 18.8
- f (character-in-line-forward-search)
- 現在行の指定文字まで移動。Emacs の viper-modeでは現在段落内の指定文字まで移動らしい。確かに、現在行だけに制限する必要は特にないと思う。
- h (move-left-by-columns)
- 左へ移動。viのアイデンティティの1つ。ひょっとして、行頭で h を押しても前の行へ移動できないのは、キーボードで左にあるキーで上へ移動しては混乱するという理由なのだろうか?
- i (insert-before-cursor)
- カーソルの前から挿入を開始する。「i や a はコマンドモードのコマンドの1つであり、vi にインサートモード・コマンドモードの区別などない。コマンドモードのみである」と主張する者もいる。/ や ? による検索をモードとみなさないことを考えると、あながち無視できないように思われる。しかしインサート中には ^D でインデントを削除したり map と map! の違いがあったりするので、やはりモードがあると考える方が妥当だろう。
- j (move-down-by-lines)
- 下へ移動。vi のアイデンティティの1つ。QWERTY 配列以外のキーボードでは vi はアイデンティティを失う。初代 vi が書かれた ADM3A のキーボード配列はADM3A keyboard layoutを見よ。
- k (move-up-by-lines)
- 上へ移動。vi のアイデンティティの1つ。
- l (move-right-by-columns)
- 右へ移動。vi のアイデンティティの1つ。
- m (set-mark)
- マーク。a から z まで26個マークできるが、26個も覚えていられるだろうか。
- n (repeat-last-search)
- 次を検索。
- o (append-after-line)
- 現在行の下に行を挿入。素直に便利。
- p (insert-after-cursor-from-buffer)
- カーソルの後ろにプット。バッファ内容が行単位の場合はプット後にカーソルが先頭に移動するが、文字単位の場合は末尾に移動する。
- r (replace-character)
- 1文字置換。このコマンドを使って1文字挿入のマクロを作ることができる。:map s i_<esc>r
- s (substitute-character)
- 1文字削除してインサートモードに入る。c が移動コマンドと組み合わせて使うものなら、s はカウントと組み合わせて使うものだろう。
- t (before-character-in-line-forward-search)
- 現在行の指定文字の手前まで移動。c,d と仲がいい。
- u (undo-last-change)
- アンドゥ。アンドゥだから u にバインドされているのはよいが、よく使う hjkliy に近く、間違って押しやすいのはどうか。
- w (move-to-next-word)
- 次の単語へ移動。一口に「次の単語へ移動」といってもその挙動はエディタによって様々である。
参照:テキストエディタ「単語単位で移動」の違い
- x (delete-character)
- カーソル下の文字を削除。初心者の方がよく使う。
- y (copy-text-to-motion-into-a-cut-buffer)
- ヤンク。ヤンクリングは欲しい。
- z (reposition-the-screen)
- zで現在行が画面1行目になるようにスクロールする。z.で画面中央行、z-で画面最下行。
- A (append-to-the-line)
- 行末から挿入を開始する。シフトと A は字面的に鋭さを感じさせるため、柔らかい感じの Emacs の C-e と対照的である。
- B (move-back-bigword)
- 空白区切りで前の単語へ移動。
- C (change-to-end-of-line)
- 行末まで変更。
- D (delete-to-end-of-line)
- 行末まで削除。
- E (move-to-end-of-bigword)
- 空白区切りで単語の末尾へ移動。
- F (character-in-line-backward-search)
- 指定文字まで移動(後方移動)。
- G (move-to-line)
- バッファの末尾へ移動。カウント指定すると、例えば 34G で34行目へ行けるが、単に移動したいだけなら :34 の方が楽だと思う。このコマンドの意義はむしろ d34G のようにオペレータの範囲を絶対指定できるところにある。これを活用するためには set number の設定が必要である。しかしそうすると画面幅を取られるのが悩ましい。また、小文字の g が空いているのに大文字の G に割り振ったのはなぜか?バッファの先頭へ移動するコマンドが存在しないのはなぜか?というのも謎である。
- H (move-to-count-lines-from-screen-top)
- 画面最上行へ移動。カウント指定で上から n 行目に行けることを覚えておくと意外と使いどころがあるかも?
- I (insert-before-first-nonblank)
- 現在行の最初の非空白文字の前から挿入を開始。
- J (join-lines)
- 行を連結。釣針で下の行を引っかけてるイメージで覚えよう。
- L (move-to-screen-bottom)
- h,l は左右へ移動なのだから、H,L は行の先頭、末尾へ移動の方がふさわしいという意見を見たことがある。
- M (move-to-screen-middle)
- 画面真ん中の行へ移動。
- N (reverse-last-search)
- 逆方向に次を検索。
- O (insert-above-line)
- 現在行の上に行を挿入。
- P (insert-before-cursor-from-buffer)
- カーソルの前にプット。行単位のプットの場合は p が便利だが、文字単位のプットには P を使いたくなることが多いだろう。
- Q (switch-to-ex-mode)
- ex モードへ移行。戻ってくるには :visual です。
- R (replace-characters)
- 置換モードへ移行。文字を蹂躙します。
- S (substitute-for-the-line)
- 行を削除し挿入を開始する。cc と同じであるため影が薄い。
- T (before-character-in-line-backward-search)
- 指定文字の手前まで移動(後方検索)。
- U (restore-the-current-line)
- 現在行に対してアンドゥ。多段アンドゥが当り前の現代エディタの前では、なんと貧弱な機能であることか。
- W (move-to-next-bigword)
- 空白区切りで次の単語へ移動。
- X (delete-character-before-cursor)
- カーソルの前の文字を削除。筆者はほとんど使ったことがない。
- Y (copy-line)
- 1行をヤンク。Y を y$ にマップするかどうかで vi 使いは2種類に分かれる。
- ZZ (save-file-and-exit)
- ファイルを保存して終了。
- [[ (move-back-section)
- 後方のセクションへ移動。
- ]] (move-forward-section)
- 前方のセクションへ移動。
- ^ (move-to-first-non-blank)
- 現在行の最初の非空白文字へ移動。$ はカウントを受け付け、3$ で 2 行下の最初の非空白文字へ移動するが、^ はカウントを受け付けない。対称性が破れている。
しかし n 行上の非空白文字へ移動するためなら、 n- がある。
参照:
- _ (move-to-first-non-blank)
- 現在行の最初の非空白文字へ移動。^ との違いはカウントを受け付けるところと d,c,y と組み合わせたとき。
- ` (move-to-mark)
- マークへ移動。
- { (move-back-paragraph)
- 後方のパラグラフへ移動。
- | (move-to-column)
- 指定桁へ移動。
- } (move-forward-paragraph)
- 前方のパラグラフへ移動。
- ~ (change-case)
- 大文字小文字を入れ替える。オペレータではないので、移動コマンドと組み合わせることはできない。
- ^[ (exit-input-mode,cancel-partial-commands)
- インサートモードを抜ける。途中まで入力したコマンドをキャンセルする。多くの vi クローンでは C-c でもインサートモードを抜けることができる。また、多くの端末では C-3 でも ^[ を送信する。
- ^] (tag-push-cursor-word)
- カーソル下の単語でタグジャンプ。
- ^^ (switch-to-previous-file)
- 前のファイルへ切り替える。
- <space> (move-right-by-columns)
- 右へ移動。
- ! (filter-through-commands-to-motion)
- 移動位置まで外部コマンドでフィルタする。exコマンドの ! よりこちらの方がかっこいい。
- $ (move-to-last-column)
- 行末へ移動。よく使う機能のわりに押しづらい。正規表現で行末を表すアトム $ からの連想だから仕方がないのか。
- % (move-to-match)
- 対応する括弧へ移動。
- & (repeat-substitution)
- 前回の置換を繰り返す。
- ' (move-to-mark)
- マークへ移動(行で最初の非空白文字)
- ( (move-back-sentence)
- 後方の文頭へ移動。
- ) (move-forward-sentence)
- 前方の文頭へ移動。
- + (move-down-by-lines)
- 下へ移動(行で最初の非空白文字)
- , (reverse-last-F-f-T-or-t search)
- F,f,T,tを繰り返す(逆方向)。よくマッピングのためにつぶされるキー。
- - (move-up-by-lines)
- 上へ移動(行で最初の非空白文字)
- . (repeat-the-last-command)
- 最後の変更を繰り返す。昔は vi にあって Emacs にない機能としてよく自慢されたらしい。津田氏の一番のお気に入りの機能。
参照:詰めvi問題1
- / (search-forward)
- 検索。正規表現検索なのがすばらしい。
- 0 (move-to-first-character)
- 1桁目へ移動。
- : (ex-command)
- ex コマンド。US キーボードではコロンを押すのにシフトキーが必要で面倒なため、mapで : と ; を入れ替える人もよくいる。なお、Bill Joyが UCB で使っていたキーボードでは、コロンを入力するのにシフトは必要ない。
- ; (repeat-last-F-f-T-or-t search)
- F,f,T,t を繰り返す。t/T の後ですぐに ; を使うと、現在のカーソル位置でマッチしてしまってそれ以上先へ進まないという興味深い特徴を持つ。
- > (shift-lines-left-to-motion)
- インデントを増やす。
- < (shift-lines-right-to-motion)
- インデントを減らす。
- ? (search-backward)
- 後方検索。
- @ (execute-buffer)
- バッファの中身をコマンドとして実行。このコマンドは意外に可能性を秘めている。
参照:素の vi で superstar
- ^B (scroll-up-by-screens)
- 1画面上へスクロール。
- ^C (interrupt-an-operation)
- 操作を中断する(読み書き、検索など)
- ^D (scroll-down-by-half-screens)
- 半画面下へスクロール。スクロールならC-fがあるのに、本当にこんなものが必要だろうか?
- ^E (scroll-down-by-lines)
- 1行上へスクロール。
- ^F (scroll-down-by-screens)
- 1画面下へスクロール。
- ^G (file-status)
- ファイルの情報を表示。本当に知りたい情報は表示してくれない。
- ^H (move-left-by-characters)
- 左へ移動。
- ^J (move-down-by-lines)
- 下へ移動。
- ^L (redraw-screen)
- 再描画。
- ^M (move-down-by-lines)
- 下へ移動(最初の非空白文字)。
- ^N (move-down-by-lines)
- 下へ移動。別にキーが空いてるからといって、同じ機能をいくつも割り当てなくていいのに。
- ^P (move-up-by-lines)
- 上へ移動。あれあれ?これは Emacs のリファレンスだっけ?
- ^Q (input-a-literal-character)
- 次に入力された文字をそのまま挿入する。
- ^T (tag-pop)
- バックタグジャンプ。
- ^U (half-page-up)
- 半画面上へスクロール。実はC-uとC-dのスクロール量はオプション'scroll'で変更できる(nvi はこれに対応していない。nvi とオリジナル vi の数少ない非互換点の1つ)。
- ^V (input-a-literal-character)
- 次に入力された文字をそのまま挿入する。
- ^Y (page-up-by-lines)
- 1行下へスクロール。
- ^Z (suspend-editor)
- サスペンド。なお、:shell では vi 内のカレントディレクトリからシェルが新規起動する。
参考
- nvi :viusage
- vim :help
- An Introduction to Display Editing with Vi
Last modified: 2018-04-29
AOYAMA Shotaro