ターミナル上で Vim を使う場合、<M-x>
などの Meta + 何とか というキーバインドが使えなくて困ることがあります。
Meta(解説)は普通の PC に付属するキーボードには存在しないため、<Esc>x
(Esc を押して離し、次に x キーを押す)という動作で代替します。
ところが、この Esc がくせ者です。Vim の Insert モードで <Esc>x
とやると、ノーマルモードに戻ってx を押した と判定され、期待と全く違った動きをします。
Meta キー → Alt キー
そこで、Alt を Meta の代わりとして使います。
Fix meta-keys that break out of Insert mode – Vim Tips Wiki
http://vim.wikia.com/wiki/Fix_meta-keys_that_break_out_of_Insert_mode
let c = 'a' while c <= 'z' execute "set <M-" . c . ">=\e" . c execute "imap \e" . c . " <M-" . c . ">" execute "set <M-S-" . c . ">=\e" . toupper(c) execute "imap \e" . toupper(c) . " <M-" . c . ">" let c = nr2char(1+char2nr(c)) endw
引用元より記述が増えているのは、M-S-x
つまり、Alt + Shift + x に対応するためです。
上記の例では M-a
〜 M-z
全てが設定されますが、特定のキーだけ指定したい場合は以下のようにします。(後述の理由により、こっちをオススメします)
:set <M-x>=<ESC>x :imap <ESC>x <M-x> :set <M-S-x>=<ESC>P :imap <ESC>X <M-S-x>
:set <M-x>=[C-v を押す][Alt-x を押す] :imap [C-v を押す][Esc を押す]x <M-x> :set <M-S-x>=[C-v を押す][Shift-Alt-x を押す] :imap [C-v を押す][Esc を押す]X <M-S-x>
ここでも Shift を組み合わせた記述を追加しています。
注意点
GUI の場合
GUI(GVim)の場合、これまでに書いたような設定は必要ありません。たとえば、Kaoriya 版 Vim だと、何もしなくても Alt が Meta として働きます。
MacVim では少々事情が違い、Option を Meta の代わりに使うためには、set macmeta
としてオプションを有効にする必要があります。
Insert モード → Normal モード
この設定を行うと Escx が強制的に置き換わるため、場合によっては不便です。
たとえば、Insert モードを抜けると同時に何か Normal コマンドを実行しようとすると図のように特殊文字が出ます。
これを避けるには以下の方法があります。
- 必ず Esc を 2 回押す癖を付ける。
timeoutlen
を小さな値に設定する。- 設定する組み合わせを限定する。
現実的なのは 3 番でしょう。あるいは、Insert モードで <M-x>
を使用することをあきらめ、Normal モードなどに限定してしまっても良いかもしれません。
よくTerminal上で使っていたため、AltをEsc代わりに使っています。
ループさせて全部マップするというアイデアを拝借して、
gvimへシームレスに移行できました。ありがとうございます!