CtrlもAltもFnも嫌いな私は近頃Vim/Nvimにハマっています。
手があまり大きくないのでコンパクトなiPad用キーボードを利用しているのですが、このキーボードは ESCがない 上に Fnとoを同時押ししないと : が入力できない などのVimを使うにはかなりやりにくいキー配置となっており、対策として私はいくつかの通常使わないキー(矢印キーなど)を ほぼ完全に別のキーにマップ しています。
このような状況ではvimrcもしくはinit.vimにマップコマンドが縦にズラーっと並ぶことになって見晴らしがよくありません。そろそろVim scriptにも慣れてきたので、ずっと気になっていたこの 「複数のモードで同じようなマッピングをするのに別々のコマンドが必要で面倒くさい!」 という問題に取り組んでみようと思います。
結論から言うと
vimrc内に次のようなコマンドを作りました。
function s:noremaps(modes,lhs,rhs)
for m in split(a:modes, '\zs')
execute m.'noremap '.a:lhs.' '.a:rhs
endfor
endfunction
command -nargs=+ Noremaps call s:noremaps(<f-args>)
第一引数にマップコマンドの接頭辞(nvxsoilct
)をつなげた文字列を渡すこと以外は、だいたい通常のnoremapと同じように動作すると思います。
使用例
" 全てのモードで→キーを:キーとして扱う
Noremaps nxsoict <Right> :
マッピングでExコマンドを呼び出す場合、neovimでは<Cmd>~<CR>
を使うことでほぼ全てのモードに対応したマッピングを行うことができます。
一方vimには<Cmd>
がないためそれぞれのモードに対応したマッピングを行う必要があり、今回作成したコマンドは役に立ちません。
コメントによるとv8.2.1978から追加されていたそうです(少し古いビルドを使っていたため気づきませんでした…)。