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