【Vim】Alt キーを Meta キーとして使う


ターミナル上で Vim を使う場合、<M-x> などの Meta + 何とか というキーバインドが使えなくて困ることがあります。

Meta解説)は普通の PC に付属するキーボードには存在しないため、<Esc>xEsc を押して離し、次に x キーを押す)という動作で代替します。

ところが、この Esc がくせ者です。Vim の Insert モードで <Esc>x とやると、ノーマルモードに戻ってx を押した と判定され、期待と全く違った動きをします。

Meta キー → Alt キー

そこで、AltMeta の代わりとして使います。

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-aM-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 だと、何もしなくても AltMeta として働きます。

MacVim では少々事情が違い、OptionMeta の代わりに使うためには、set macmeta としてオプションを有効にする必要があります。

Insert モード → Normal モード

この設定を行うと Escx が強制的に置き換わるため、場合によっては不便です。

120722-0003.png

たとえば、Insert モードを抜けると同時に何か Normal コマンドを実行しようとすると図のように特殊文字が出ます。

これを避けるには以下の方法があります。

  1. 必ず Esc を 2 回押す癖を付ける。
  2. timeoutlen を小さな値に設定する。
  3. 設定する組み合わせを限定する。

現実的なのは 3 番でしょう。あるいは、Insert モードで <M-x> を使用することをあきらめ、Normal モードなどに限定してしまっても良いかもしれません。

One thought on “【Vim】Alt キーを Meta キーとして使う

  1. よくTerminal上で使っていたため、AltをEsc代わりに使っています。
    ループさせて全部マップするというアイデアを拝借して、
    gvimへシームレスに移行できました。ありがとうございます!

コメントを残す