前書き
まずは,簡単な説明をする.
$ 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>
を含むマッピングが可能になる.
この記事中ではノーマルモードでのマッピングのみ取り上げたが,他のモードでのマッピングについても同様である.