1.概要
- プログラマーにとって、VimとEmacsのkey bindingは必須だと思う
- BrowserのURLバーやどのShell、IDEにも、Key bindingsとして組み込まれていたりする
- 特に、テキスト編集で次の結論である
- 複数行編集 => Vim key bindings
- 単数行編集 => Emacs key bindings
2.VIM
2.1.モード
| モード | 機能 | 切替方法 |
|---|
| ノーマル | カーソルの移動や文字列のヤンクなどができる | vimを起動したとき、もしくは「esc」を押す |
| 挿入 | 文字列の挿入ができる | ノーマルモードで「i」「a」「I」「A」のいずれかを押す |
| ビジュアル | 矩形選択ができる | ノーマルモードで「v」「V」「Ctrl+v」のいずれかを押す |
| exコマンド | ファイルの保存や文字列の検索ができる | ノーマルモードで「:」「/」「?」のいずれかを押す |
2.2.文型
| 文型 | 型 |
|---|
| 第1文型(C) | {command} |
| 第2文型(M) | {motion} |
| 第3文型(OM) | {operator}{motion} |
| 第4文型(SO) | {selector}{operator} |
| 第5文型(OT) | {operator}{text-object} |
2.3.品詞
| コマンド | 機能 |
|---|
| コマンド(C) | それ一つで編集(編集対象と編集方法)が完結する操作 |
| モーション(M) | 基本的に行を示す操作。カーソルの移動にも使う |
| オペレーター(O) | 編集方法を示す操作 |
| セレクター(S) | 行列(矩形)の編集範囲を示す操作 |
| テキストオブジェクト(T) | 編集するテキストを示す操作。記号などで囲まれているものの中を編集範囲にできる |
| カウント | 各文の繰り返し回数を示す操作 |
2.4.第一文型(C)
2.4.1.スクロール移動
| コマンド | 機能 |
|---|
| Ctrl-u | 半画面分の上へ(アップ) |
| Ctrl-d | 半画面分の下へ(ダウン) |
| Ctrl-b | 一画面分の上へ(バックフォワード) |
| Ctrl-f | 一画面分の下へ(フォワード) |
2.4.2.行に対する編集
| コマンド | 機能 |
|---|
| dd | カーソルのある行デリート |
| D | カーソルから行末までデリート |
| cc | カーソルのある行カット |
| C | カーソルから行末まで行カット |
| yy | カーソルのある行までヤンク |
| Y | カーソルから行末までヤンク |
| s | カーソルのある文字を消して挿入モードに入る |
| S | カーソルのある1行を全て消して挿入モードにはいる |
2.4.3.カットとプット
| コマンド | 機能 |
|---|
| x | カーソルの下の文字を消す |
| X | カーソル一つ前の下の文字を消す |
| p | カーソルの下の行にプット |
| P | カーソルの行にプット |
2.4.4.数値の編集
| コマンド | 機能 |
|---|
| Ctrl-a | カーソルのある行の数値を足す(インクリメント) |
| Ctrl-x | カーソルのある行の数値を減らす(デクリメント) |
2.4.5.アンドゥ・リドゥー、 繰り返し
| コマンド | 機能 |
|---|
| u | アンドゥー |
| Ctrl-r | リドゥー |
| . | 直前のコマンドを繰り返す |
2.4.6.インデントの編集
| コマンド | 機能 |
|---|
| » | インデントをつける |
| « | インデントをなくす |
| ctrl-t | 挿入モードでインデントを追加 |
| ctrl-d | 挿入モードでインデントを削除 |
2.4.7.挿入
| コマンド | 機能 |
|---|
| i | カーソル位置からインサートモードに入る |
| a | カーソルの直後からインサートモードに入る |
| I | 行頭からインサートモードに入る |
| A | 行末からインサートモードに入る |
2.5.第二文型(M)
2.5.1.基本移動
| コマンド | 機能 |
|---|
| h | カーソルを左にずらす |
| j | カーソルを下に下げる |
| k | カーソルを上に上げる |
| l | カーソルを右にずらす |
| gj | カーソルを下に下げる(折り返しにも対応している) |
| gk | カーソルを上に上げる(折り返しにも対応している) |
2.5.2.基本行移動
| コマンド | 機能 |
|---|
| + | 下の行の先頭へ |
| - | 上の行の先頭へ |
| _ | -1 行下の最初の非空白文字に移動 |
| gg | そのファイルの先頭へ(Goto) |
| G | そのファイルの末尾へ(Goto) |
2.5.3.オブジェクト単位で移動
| コマンド | 機能 |
|---|
| ( | 文後方に |
| ) | 文前方に |
| { | 段落後方に |
| } | 段落前方に |
| [[ | セクション前方に、もしくは1桁目が ‘}’ で始まる次の場所に。 |
| ]] | セクション後方に、もしくは1桁目が ‘}’ で始まる次の場所に。 |
| [] | セクション後方に、もしくは1桁目が ‘}’ で始まる次の場所に。 |
| ][ | セクション前方に、もしくは1桁目が ‘}’ で始まる次の場所に。 |
2.5.4.行頭行末移動
| コマンド | 機能 |
|---|
| 0 | 行の先頭へ |
| ^ | 行の先頭へ(最初の非空白文字へ移動) |
| $ | 行の末尾へ |
2.5.5.単語の単位で移動
| コマンド | 機能 |
|---|
| w | 次の単語の先頭に進む(ワード) |
| W | 次の単語(記号では区切られれていない)の先頭に進む |
| b | 次の単語の先頭に戻る(バッグ) |
| B | 次の単語(記号では区切られれていない)の先頭に戻る |
| e | 今の単語の末尾に進む(エンド) |
| E | 今の単語(記号では区切られれていない)の末尾に進む |
| ge | 前の単語の末尾に戻る(Gotoエンド) |
| gE | 前の単語(記号では区切られれていない)の末尾に戻る(Gotoエンド) |
2.5.6.行内で検索して移動
| コマンド | 機能 |
|---|
| fa | 次のaまで飛ぶ |
| Fa | 前のaまで飛ぶ |
| ta | 次のaの手前まで飛ぶ |
| Ta | 前のaの次まで飛ぶ |
| ; | f, F, t, Tで検索した文字を同方向に繰り返し検索する |
| , | f, F, t, Tで検索した文字を逆方向に繰り返し検索する |
| % | ついになる括弧に移動 |
| / | |
2.5.7.検索して移動
| コマンド | 機能 |
|---|
| /word | 文字列wordを検索(上から下へ) |
| ?word | 文字列wordを検索(下から上へ) |
| * | カーソルより下の文字を検索する |
| # | カーソルより上の文字を検索する |
| n | 次の候補に |
| N | 前の候補に |
2.6.オペレーター(O)
2.6.1.デリート・カット・ヤンク
| コマンド | 機能 |
|---|
| d | 選択範囲をデリート |
| c | 選択範囲をカットして挿入モードに移行する |
| y | 選択範囲をヤンク |
2.6.2.インデント
| コマンド | 機能 |
|---|
| > | 右にシフトする |
| 左にシフトする |
| ! | 外部コマンドを使ってフィルターに通す |
| = | インデント整える |
2.6.3.大文字小文字入れ替え
| コマンド | 機能 |
|---|
| ~ | 大文字/小文字を入れ換える |
| g~ | 大文字/小文字を入れ換える |
| gu | 小文字にする |
| gU | 大文字にする |
2.6.4.折りたたみ関係
| コマンド | 機能 |
|---|
| zi | 折り畳みの有効無効の切り替え |
| zf{motion} | 折り畳みを作成する(第三文型) |
| za | 折り畳みの開け閉め |
| zd | 折り畳みを削除する |
| zA | 折り畳みの開け閉め(再帰) |
| zD | 折り畳みを削除する(再帰) |
| zE | 全ての折り畳みを削除 |
| zR | 全ての折り畳みを開く |
| zM | 全ての折り畳みを閉じる |
2.7.第三文型(OM)
2.7.1.単語に対する編集コマンド
| コマンド | 機能 |
|---|
| yw | カーソル下のワードをヤンク |
| cw | カーソルの下のワードをカット |
| dw | カーソル下のワードをデリート |
2.7.2.行に対する編集
| コマンド | 機能 |
|---|
| d$ | カーソルから行末までデリート |
| c$ | カーソルから行末までカット |
| y$ | カーソルから行末までヤンク |
| dG | カーソル行以下をデリート |
| cG | カーソル行以下をカット |
| yG | カーソル行以下をヤンク |
| ggVG | 全選択 |
2.7.3.カッコを閉じる
| コマンド | 機能 |
|---|
| f{ zf % | {の括弧を閉じる |
| space | 選択範囲を開ける |
2.8.セレクター(S)
| コマンド | 機能 |
|---|
| v | 文字単位で選択 |
| Ctrl-v | ブロック単位で選択 |
| V | 行単位で選択 |
2.9.第四文型(SO)
2.9.1.複数行のインデントの操作
| コマンド | 機能 |
|---|
| Ctrl-V j = | 行を矩形選択して、「=」でインデントを揃える |
2.9.2.複数行の行頭・行末に同じ文字を挿入する
※大文字・小文字のvに注意。
| コマンド | 機能 |
|---|
| Ctrl-v $ A 文字入力 or Ctrl-V A 文字入力 | 行末同じ文字列を入れる |
| Ctrl-V ^ I 文字入力 | 行頭同じ文字列を入れる |
2.9.3.複数行のある行又は列の文字列を削除・挿入・置換する
| コマンド | 機能 |
|---|
| Ctrl-V j d | 任意の行列を削除する |
| Ctrl-v j d | 任意の列を削除する |
| Ctrl-V j c 文字入力 | 任意の行列を挿入する |
| Ctrl-v j c 文字入力 | 任意の列を挿入する |
| Ctrl-v j i 文字入力 esc | 任意の列に同じ文字列を入れる |
| Ctrl-v j d 文字入力 esc | 任意の列に同じ文字列を入れる |
| Ctrl-V j d 文字入力 esc | 任意の行を文字列を入れる |
| Ctrl-v r 文字入力 | 任意の列を置き換えるする |
| Ctrl-V r 文字入力 | 任意の行列を置き換えるする |
2.9.4.複数行削除
| コマンド | 機能 |
|---|
| Ctrl-V j I 文字入力 esc | ある列に同じ文字列を入れる |
2.9.5.選択範囲を閉じる
| コマンド | 機能 |
|---|
| Ctrl-V zf | 選択範囲を閉じる |
| space | 選択範囲を開ける |
2.10.テキストオブジェクト(T)
2.10.1.テキストオブジェクトのプレフィックス
| コマンド | 機能 |
|---|
| {Operator} a {Text object} | 対象のオブジェクとのその中身に対してオペーレーターの操作をする(a) |
| {Operator} i {Text object} | 対象のオブジェクの中身に対してオペーレーターの操作する(inner) |
2.10.2.テキストオブジェクト
| コマンド | 機能 |
|---|
| w | 単語を区切りそうな文字列まで |
| W | 非空白文字の連続 |
| [,(,{,<,",` | 左の記号で囲まれている文字列 |
| b | ブロック。() 等カーソル位置から直近の囲み文字の範囲(前方一致) |
| B | block ブロック。() 等カーソル位置から直近の囲み文字の範囲(後方一致) |
| t | タグ |
2.11.第五文型(OT)
2.11.1.プレーンテキストの文字の中身消し
| コマンド | 機能 |
|---|
| dit | カーソルのある行の最初のタグの中身を消す |
| cit | カーソルのある行の最初のタグの中身を消して挿入モードへ移行する |
| diw | カーソルのある行の最初の単語の中身を消す |
| ciw | カーソルのある行の最初の単語の中身を消して挿入モードへ移行する |
| dis | カーソルのある行の最初のセンテンスの中身を消す |
| cis | カーソルのある行の最初のセンテンスの中身を消して挿入モードへ移行する |
| dip | カーソルのある行の最初のパラグラフの中身を消す |
| cip | カーソルのある行の最初のパラグラフの中身を消して挿入モードへ移行する |
2.11.2.プログラミング言語の文字の中身消し
| コマンド | 機能 |
|---|
| di" | カーソルのある行の最初の"の中身を消す |
| ci" | カーソルのある行の最初の"の中身を消して挿入モードへ移行す |
| di[ | カーソルのある行の最初の[の中身を消す |
| ci[ | カーソルのある行の最初の[の中身を消して挿入モードへ移行す |
2.11.3.同じ文字列をの置換
| コマンド | 機能 |
|---|
| * n cw esc n . | *で見つかったワード一つ一つを置換する |
| :/%s/word/word2 | wordをword2にいっぺんに置換する |
2.11.4.関数の削除コマンド
| コマンド | 機能 |
|---|
| di{ | 波括弧を使うJavaなどの言語で、関数の中味を消す |
| dap | 波括弧を使わないPythonなどの言語で、関数の中味を消す |
2.12.その他の第一文型(C)
2.12.1.ファイル移動
2.12.2.ファイル表示操作
| コマンド | 機能 |
|---|
| :e filename | filenameを現在のウィンドウで開く(:edit) |
| :sp filename | filenameを横分割したウィンドウで開く(:split) |
| :vs filename | filenameを縦分割して開く(:vsplit) |
| :sv filename | filenameを横分割で読み取り専用で開く(:sview) |
2.12.3.ファイル保存操作
| コマンド | 機能 |
|---|
| :w hoge.txt | hoge.txtという名前つけて保存 |
| :q | ウィンドウを閉じる |
| :wq | 保存して終了 |
| :q! | 保存せずウィンドウを閉じる |
| :qa! | 保存せず全てのウィンドウを閉じる |
2.12.4.ウィンドウ
| コマンド | 機能 |
|---|
| Ctrl-w h | 左のウィンドウへ |
| Ctrl-w j | 下のウィンドウへ |
| Ctrl-w k | 上のウィンドウへ |
| Ctrl-w l | 右のウィンドウへ |
| Ctrl-w = | ウィンドウを全て同じ大きさに |
| Ctrl-w + | ウィンドウの高さを一行増やす |
| Ctrl-w - | ウィンドウの高さを一行減らす |
| Ctrl-w < | ウィンドウの幅を一文字減らす |
| Ctrl-w > | ウィンドウの幅を一文字増やす |
2.12.5.タブ
2.12.6.貼り付け方法の変更
| コマンド | 機能 |
|---|
| :set paste | ペーストモードに(オートインデントされない) |
| :set nopaste | noペーストモードに(オートインデントされる) |
2.12.7.補完(挿入モードのサブモード)
| コマンド | 機能 |
|---|
| Ctrl-x | サブモードのプレフィックス |
| Ctrl-x Ctrl-o | Omni補完表示 |
| Ctrl-x Ctrl-n | 局所キーワード補完(前方) |
| Ctrl-x Ctrl-p | 局所キーワード補完(後方) |
| Ctrl-n | 次の候補へ(補完表示中) |
| Ctrl-p | 前の候補へ(補完表示中) |
| CTRL-e | 補完中止 |
2.12.8.Marks
小文字はローカルマーク、大文字はグローバルマークとなる。
| コマンド | 機能 |
|---|
| :marks | mark一覧を表示する |
| m[a-zA-Z] | カーソル位置をmarkする |
| `` | 直前のマークへ移動 |
| C-o | 古いマークへ移動 |
| C-i | 新しいマークへ移動 |
| `[a-zA-Z] | 指定のマークに移動 |
| ‘[a-zA-Z] | 指定のマークの行頭に移動 |
| :delmarks [a-zA-Z] | マークの削除 |
| :delmarks! | マークの一括削除 |
2.12.9.ヘルプ
2.13.よく使うパターン
2.13.1.日付の自動生成
次のマクロでmarkdownの日付を自動生成している。
1
| 1 -> esc -> qa -> yyp -> ctrl-a -> q -> @a -> 30@@
|
もしくは、下でもいい。
1
| 1 -> esc -> qa -> yyp -> ctrl-a -> q -> @a -> @@の連打
|
3.Emacs
3.1.基本的なカーソル移動
| コマンド | 機能 |
|---|
| Ctrl-a | 行の先頭へ移動 |
| Ctrl-e | 行の末尾へ移動 |
| Ctrl-f | 一文字前へ移動(フォワード) |
| Ctrl-b | 一文字後ろへ移動(バックワード) |
| Ctrl-n | 次の行へ移動(ネクスト) |
| Ctrl-p | 前の行へ移動(プリヴィアス) |
| Alt-f | 単語単位で前へ移動(フォワードワード) |
| Alt-b | 単語単位で後ろへ移動(バックワードワード) |
3.2.テキスト編集
| コマンド | 機能 |
|---|
| Ctrl-d | カーソル位置の文字を削除 + |
| Ctrl-k | カーソル位置から行末までを削除(カット) + |
| Ctrl-u | カーソル位置から行頭までをカット + |
| Ctrl-y | ヤンク(クリップボードからペースト) + |
| Alt-d | カーソル位置から単語を削除 + |
| Ctrl-w | 選択したテキストをカット + |
| Alt-w | 選択したテキストをコピー + |
4.まとめ
- VimとEmacsは基本なので必修科目
- 特に、別EditorでもVimのkey bindingは大体実装されているので、覚えておいて損はない
- また、EmacsはCtrl-a, e, u, kの4つさえ覚えていればTerminalやURLバーの編集で困ることはあまりない
- とかく、両方使いこなせればプログラマーだろう
5.References