Featured image of post よく使うVimとEmacsのKey bindingsの備忘録

よく使うVimとEmacsのKey bindingsの備忘録

目次

概要

  • プログラマーにとって、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ブロック。() 等カーソル位置から直近の囲み文字の範囲(前方一致)
Bblock ブロック。() 等カーソル位置から直近の囲み文字の範囲(後方一致)
tタグ

第五文型(OT)

プレーンテキストの文字の中身消し

コマンド機能
ditカーソルのある行の最初のタグの中身を消す
citカーソルのある行の最初のタグの中身を消して挿入モードへ移行する
diwカーソルのある行の最初の単語の中身を消す
ciwカーソルのある行の最初の単語の中身を消して挿入モードへ移行する
disカーソルのある行の最初のセンテンスの中身を消す
cisカーソルのある行の最初のセンテンスの中身を消して挿入モードへ移行する
dipカーソルのある行の最初のパラグラフの中身を消す
cipカーソルのある行の最初のパラグラフの中身を消して挿入モードへ移行する

プログラミング言語の文字の中身消し

コマンド機能
di"カーソルのある行の最初の"の中身を消す
ci"カーソルのある行の最初の"の中身を消して挿入モードへ移行す
di[カーソルのある行の最初の[の中身を消す
ci[カーソルのある行の最初の[の中身を消して挿入モードへ移行す

同じ文字列をの置換

コマンド機能
* n cw esc n .*で見つかったワード一つ一つを置換する
:/%s/word/word2wordをword2にいっぺんに置換する

関数の削除コマンド

コマンド機能
di{波括弧を使うJavaなどの言語で、関数の中味を消す
dap波括弧を使わないPythonなどの言語で、関数の中味を消す

その他の第一文型(C)

ファイル移動

コマンド機能
Ctrl-o戻る
Ctrl-t進む

ファイル表示操作

コマンド機能
:e filenamefilenameを現在のウィンドウで開く(:edit)
:sp filenamefilenameを横分割したウィンドウで開く(:split)
:vs filenamefilenameを縦分割して開く(:vsplit)
:sv filenamefilenameを横分割で読み取り専用で開く(:sview)

ファイル保存操作

コマンド機能
:w hoge.txthoge.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 >ウィンドウの幅を一文字増やす

タブ

コマンド機能
gt次のタブへ
gT前のタブへ

貼り付け方法の変更

コマンド機能
:set pasteペーストモードに(オートインデントされない)
:set nopastenoペーストモードに(オートインデントされる)

補完(挿入モードのサブモード)

コマンド機能
Ctrl-xサブモードのプレフィックス
Ctrl-x Ctrl-oOmni補完表示
Ctrl-x Ctrl-n局所キーワード補完(前方)
Ctrl-x Ctrl-p局所キーワード補完(後方)
Ctrl-n次の候補へ(補完表示中)
Ctrl-p前の候補へ(補完表示中)
CTRL-e補完中止

Marks

小文字はローカルマーク、大文字はグローバルマークとなる。

コマンド機能
:marksmark一覧を表示する
m[a-zA-Z]カーソル位置をmarkする
``直前のマークへ移動
C-o古いマークへ移動
C-i新しいマークへ移動
`[a-zA-Z]指定のマークに移動
‘[a-zA-Z]指定のマークの行頭に移動
:delmarks [a-zA-Z]マークの削除
:delmarks!マークの一括削除

ヘルプ

コマンド機能
:h {command}ヘルプ

よく使うパターン

日付の自動生成

次のマクロで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

Built with Hugo
テーマ StackJimmy によって設計されています。