はじめに
普段 Linux サーバ管理作業では vim を使っていますが、手元の OS X 環境では emacs を使ってメモなどを取っています。が、やはり vim ほど emacs は使えていないのであのコマンドはどうやるんだっけ?というときの Vimmer 視点のメモ書きです。思いついた時々で更新します。
- エディタにもともと備わっている機能についてのみのです
- GUI はほとんど使わないので CUI で利用可能なコマンドです
- あまりにも基本的すぎると思っているコマンド(
C-s
、C-x
C-c
など)はいまのところ載せていません - 以下のバージョンで確認しています
- vim: 7.4.540
- emacs: 24.3.1
コマンド比較表
標記について
C-a
はCtrl
を押しながらa
を押すことを意味しますM-v
は多くの場合ESC
を押したあとにv
を押すことを意味します。ESC
はC-[
でも代用できます。- キーマップに割り当てられているコマンドについては括弧書きで併記します
- vim:
:sp[lit]
※[]
内は省略可能 - emacs
split-window-vertically
- vim:
- 省略可能な数引数については
[count]
と表記します
カーソル移動
文字や単語、ページの移動については vim、emacs ともに数引数が使えます。
コマンド | vim | emacs |
---|---|---|
行先頭 | 0 | C-a (beginning-of-line ) |
行末尾 | $ | C-e (end-of-line ) |
1文字右 | l | C-f (forward-char ) |
1文字左 | h | C-b (backward-char ) |
1単語右※ | w | M-f (forward-word ) |
1単語左 | b | M-b (backward-word ) |
1行下 | j | C-n (next-line ) |
1行上 | k | C-p (previous-line ) |
1ページ下 | C-f | C-v (scroll-up ) |
1ページ上 | C-b | M-v (scroll-down ) |
バッファ先頭 | gg 1G | M-< (beginning-of-buffer ) |
バッファ末尾 | G | M-> (end-of-buffer ) |
表示領域の中央 | H | M-r (move-to-window-line ) |
カーソル行をウィンドウの最上部に | z<Enter> | C-l (recenter-top-bottom )トグルなので2度押し |
カーソル行をウィンドウの中央に | z. | C-l (recenter-top-bottom )カーソルがウィンドウ下半分にあるとき |
※単語右については、単語の区切りが少し異なります
- vim: カーソル下の単語から、次の単語の先頭文字
- emacs: 次の単語の先頭文字の左
編集
コマンド | vim | emacs |
---|---|---|
すべてを選択 | C-x h | |
矩形選択※ | C-v (で矩形ビジュアルモードを開始して範囲を設定して) | (リージョンを設定して) |
置換(空白文字) | r <SPACE> | C-x r c (clear-rectangle ) |
置換(任意文字) | c 任意文字 <ESC> | C-x r t 任意文字<RET> (string-rectangle ) |
挿入(空白文字) | yPgvr<SPACE> ※選択範囲をコピー( y )して貼り付け(P )、その範囲( gv )を空白で置換(r<SPACE> ) | C-x r o (open-rectangle ) |
削除 | d | C-x r d (delete-rectangle ) |
単語を小文字に | veu | M-l (downcase-word ) |
単語を大文字に | veU | M-u (upcase-word ) |
バッファ
コマンド | vim | emacs |
---|---|---|
保存 | :w | C-x C-s (save-bufffer ) |
ファイルに保存 | :sav[e] {filename} | C-x C-w (write-file )でファイル名入力プロンプト |
一覧 | :ls | C-x C-b (list-buffers ) |
読み取り専用に | :setl[ocal] ro | C-x C-q (read-only-mode ) |
※Emacs 24.4の矩形選択機能は試していないので分かりません
ウィンドウ
コマンド | vim | emacs |
---|---|---|
上下2分割 | C-w s (:sp[lit] ) | C-x 2 (split-window-vertically ) |
左右2分割 | C-w v (:vsp[lit] ) | C-x 3 (split-window-horizontally ) |
カレントを閉じる | C-w c (:clo[se] ) | C-x 0 (delete-window ) |
カレント以外を閉じる | C-w o (:on[ly] ) | C-x 1 (delete-other-windows ) |
別を選択 | C-w w C-w C-w | C-x o (other-window ) |
別を選択2 | ※左下上右C-w {hjkl} C-w C-{hjkl} C-w {←↓↑→} | |
全てを同じ高さにする | C-w = | C-x + (balance-windows ) |
大きすぎる場合は縮める | C-x - (shrink-window-if-larger-than-buffer ) | |
高さを広げる | C-w [count] + | [count] C-x ^ (enlarge-window ) |
高さを狭める | C-w [count] - | [count] M-x shrink-window |
幅を狭める | C-w [count] < | [count] C-x { (shrink-window-horizontally ) |
幅を広げる | C-w [count] > | [count] C-x } (enlarge-window-horizontally ) |
タブ(vim)/フレーム(emacs)
同じカテゴリにするには少し無理がありますが、複数のウィンドウをまとめたもの、ということで。
なおタブ(tabpage
)は Vim 7.3 から使えます。
コマンド | vim | emacs |
---|---|---|
新規作成 | :tabnew | C-x 5 2 (make-frame-command ) |
カレントを閉じる | :tabc[lose] | C-x 5 0 (delete-frame ) |
カレント以外を閉じる | :tabo[nly] | C-x 5 1 (delete-other-frames ) |
別を選択 | gt (:tabn[ext] ) | C-x 5 o (switch-to-buffer-other-frame ) |
別を選択2 | gT (:tabp[revious] ) :tabfir[st] or :tabr[ewind] :tabl[ast] | |
一覧 | :tabs |
マクロ
コマンド | vim | emacs |
---|---|---|
記録開始 | q {レジスタ(a-z0-9")} | C-x ( (start-kbd-macro ) |
記録終了 | q | C-x ) (end-kbd-macro ) |
実行 | @ {レジスタ(a-z0-9".=*+}) | C-x e (call-last-kbd-macro ) |
編集 | ※Vimのマクロ編集 | C-x C-k (edit-kbd-macro ) |
マクロを実行する目的の多くはコマンドの連続実行なので、多くの場合は数引数をつけて実行します。
コマンド | vim | emacs |
---|---|---|
数引数 | [count] →@ レジスタ | M [count] (digit-argument )→C-x e |
Vimのマクロ編集
Vim のマクロはレジスタに記録された文字列に過ぎないので、一度それをバッファに展開して編集したあとにレジスタに登録し直します。
- 追記する場合:
q
{レジスタの大文字(A-Z)}
- 編集する場合: レジスタの内容をバッファに表示して編集し、レジスタに書き戻す
:put {レジスタ(a-z)}
- バッファに貼り付けられたレジスタ内容を編集
0{レジスタ(a-z)}y$
(行の先頭から末尾までの内容を任意のレジスタにコピー)- レジスタの内容を確認する場合は
:reg[isters]