koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

Vimで<C-c>を含むマッピングをするときに注意すること

前書き

まずは,簡単な説明をする.

$ vim -u NONE

としてvimを立ち上げて, :nnoremap :<C-u>a<C-c>echo 'Hello World!'<CR> のようにマッピングしてみよう. そして,ノーマルモードにて, a<C-c> と入力すると, Hello World! とエコーされず,

Type  :quit<Enter>  to exit Vim

と表示されると思う. (このメッセージはロケールに依存する.上記は language messages C のときの例)

本題

<C-c> を含むマッピングを行うときには注意しなければならない. vim-jpのissueにあるように,

nnoremap z<C-c> :<C-u>echo 'key mapping works'<CR>

マッピングをして,ノーマルモードで z<C-c> と押すと <C-c> のデフォルトの動作をしてしまう. だが,

nnoremap <C-c> <NOP>

のように, <C-c> に対して何か適当なマッピングを行い,再度 z<C-c> と押すと,

key mapping works

と表示される. 古いVimであれば,

nunmap <C-c>

として, z<C-c> と入力しても,

key mapping works

と表示されていたが,いつからか(Vim 8.4.xxx 以降あたり)から再び

Type  :quit<Enter>  to exit Vim

と表示されるようになり,一貫性のある動作をするようになった.

このように <C-c> 単体に何らかのマッピングをしていない場合, <C-c> を含むマッピングができないので,

nnoremap <C-c> <NOP>

もしくは,

nnoremap <C-c> <C-c>

マッピングしておくことをオススメする. 後者であれば,デフォルトの <C-c> 単体の動作を消すことなく, <C-c> を含むマッピングが可能になる.

この記事中ではノーマルモードでのマッピングのみ取り上げたが,他のモードでのマッピングについても同様である.

参考