【一人 vimrc advent calendar 2017】キーマッピングの注意点とか【24日目】

一人 vimrc advent calendar 2017 24日目の記事になります。
今日はクリスマスイヴですね。
ケーキを買いに行ったら売り切れていましたかなしい。

モードごとのキーマッピング

さて、気を取り直して…。
Vim はモードごとに操作が分けられているのはご存知だと思いますが、キーマッピングもモードごとに設定することが出来ます。
代表的なのは以下のようなものになります。

登録コマンド 削除コマンド モード
:map :noremap :unmap ノーマル、ビジュアル、選択、オペレータ待機
:nmap :nnoremap :nunmap ノーマル
:vmap :vnoremap :vunmap ビジュアル、選択
:smap :snoremap :sunmap 選択
:xmap :xnoremap :xunmap ビジュアル
:omap :onoremap :ounmap オペレータ待機
:map! :noremap! :unmap! 挿入、コマンドライン
:imap :inoremap :iunmap 挿入
:lmap :lnoremap :lunmap 挿入、コマンドライン、Lang-Arg
:cmap :cnoremap :cunmap コマンドライン

いろいろとありますが、基本的には

  • :nmap :nnoremap
  • :vmap :vnoremap
  • :imap :inoremap
  • :cmap :cnoremap

の4つを覚えておけばよいです(あとは textobj 系プラグインを使うなら omap も。
キーマッピング自体の仕方はまあわかってると思うので省略。

mapnoremap の違い

Vim でキーマッピングをする上で重要なのが mapnoremap の違いになります。
と、言っても特に難しくはなくて map は『再マップされ』、noremap は『再マップされません』。
どういうことかというと例えば、

imap a aa

とした場合、a を入力した時に aa を更に展開しようとするので無限ループします。
一方、

inoremap a aa

の場合は aa は再展開されないので aa だけが入力されます。
なのでキーマッピングを行う際に『他に設定したキーマッピングの影響を受けない場合は :noremap』、『他に設定したキーマッピングの影響を受ける場合は :map』みたいにして使い分ける必要があります。
と、言っても意図的に展開してほしい場合以外は noremap を使っておくほうが混乱がないと思います。

ただし、プラグインを使用していると例えば、

nmap hoge <Plug>(hoge-plugin-mapping)

みたいに <Plug>(hoge-plugin-mapping) をキーマッピングすることがあります。
この <Plug>(hoge-plugin-mapping) というのは『プラグイン側でマッピングされている設定』になります。

" プラグイン内ではこんな感じでキーマッピングされている
nnoremap <silent> <Plug>(hoge-plugin-mapping) :<C-u>Hoge<CR>

なので、このような場合は mapマッピングする必要があります。

まとめ

  • Vim ではモードごとにキーマッピングを行うことが出来る
  • mapnoremap は再展開されるかされないかの違い
  • 基本的には noremap を使っておくほうが副作用がなくて安全


キーマッピングについてはいろいろと書きたいことはあるんですが、まー基本的には変な縛りを設けないで自分が使いやすいようなキーマッピングをしておくとストレスなく Vim を使うことが出来るのでよいと思います。
Vim に慣れるのではなくて、自分が使いやすい Vim を目指しましょう。