予想に反して、実際にはすべてのモードに当てはまるわけではnoremap
ありません。map
の非常に役立つ要約に基づいて、 、、、の前に (または の場合は後ろに):help map-listing
付けることができる文字と、それらが適用されるモードのリストを次に示します。!
map
noremap
unmap
mapclear
- (なし) – 通常、ビジュアル、選択、およびオペレーター保留中
n
- 普通
v
– ビジュアルとセレクト
x
– ビジュアル
s
- 選択する
o
– オペレーター保留中
!
– 挿入とコマンドライン
i
- 入れる
c
- コマンドライン
l
– Insert、Command-line、および Lang-Arg の「:lmap」マッピング
そのため、noremap
マッピングは挿入モードまたはコマンドライン モードでは効果がなく、考慮しなければ、ビジュアル モード、選択モード、またはオペレータ ペンディング モードでも意図したとおりに機能しない可能性があります。
ただし、モードを変更してマッピングに戻すだけで、マッピングをさまざまなモードで動作するように適応させることができます。たとえば、noremap
コマンドライン コマンドを発行するが通常モードでのみ機能するマッピングは、次の例に示すように、他のモードでも機能するように適合させることができます。
noremap <C-Tab> :<C-U>set list!<CR>
inoremap <C-Tab> <C-O>:set list!<CR>
cnoremap <C-Tab> <C-C>:set list!<CR>:<Up>
noremap
:<C-U>
Vim が範囲を挿入した場合に備えて、コマンドライン モードに入り、現在の行をクリアする、Normal、Visual、Select、および Operator-pending モードに適用されます。inoremap
挿入モードに適用されます。<C-O>:
一時的に通常モードを終了してから、コマンドライン モードに入ります。およびcnoremap
コマンドライン モードに適用されます。コマンドライン モードを<C-C>:
終了してから再入力すると、ラインがクリアされますが、 とは異なり<C-U>
、コマンド ヒストリに保持されるため、:<Up>
元に戻すことができます。
これら 3 つのマッピングは、6 つのモードすべてをカバーします。(明らかに 'Lang-Arg' はモードではありません。) 動作しないコーナー ケースがいくつかありますが、動作しないと思っていたときに動作するケースもいくつかあります。理由がわかりません。また、マップされたコマンドがそうでなければこれらのものを失うことはなくても、ほとんどのモードは選択や保留中の演算子などの小さなものを失います。たとえば、挿入モードの場合、私が示した例では、現在の編集を元に戻す/やり直しの履歴の個別の変更に分割する必要がある理由がわかりません ( と入力してみてくださいi123<C-O><Esc>456<Esc>u
)。正直なところ、この方法でキー マッピングを使用してコマンドを実行するのは、ちょっとしたハックのように思えますが、別の方法は知りません。