6

を使用して矢印キーのバインドを解除することを検討してください

 noremap <Left>  <NOP>
 noremap <Right> <NOP>
 noremap <Up>    <NOP>
 noremap <Down>  <NOP>

これは通常モードでは機能しますが、挿入モードでは機能しませ。矢印キーでナビゲートできます。対策として、含める必要があります

 inoremap <Left>  <NOP>
 inoremap <Right> <NOP>
 inoremap <Up>    <NOP>
 inoremap <Down>  <NOP>

しかし、これは私には意味がありません。なぜなら、すべてのモードで動作すると仮定mapし、noremap動作するはずであるのに対し、先頭に追加n/v/x/s/o/i/l/cすると、その特定のモード内でのみ動作するようにマッピングが指定されるからです。これには理由がありますか?

4

3 に答える 3

4

map と map の両方を発行するのではなく、包括的なモーダル マップがないのはなぜですか。

:iabb説明は簡単です: 挿入モードのマッピングでは、Vim は自動的に通常モードに切り替わらないため (通常、テキストの翻訳はではなく を介して行われますが、挿入モードのままにしたい場合があります:imap)、適用可能なコマンドのセットはまったく異なります。 . たとえば、通常モードでは Ctrl-U は上にスクロールしますが、挿入モードでは行に入力された文字を削除します!

のようなプレフィックスは、<C-O>一時的に挿入モードから通常モードに切り替えます。実際には、次の例に示すように、コマンド ライン モード用に別のプレフィックスを定義する必要さえあることがよくあります。

noremap <C-Tab> :<C-U>tabnext<CR>
inoremap <C-Tab> <C-O>:tabnext<CR>
cnoremap <C-Tab> <C-C>:tabnext<CR>

したがって、マッピングを定義するときは、マッピングが必要なモードと再マッピングが必要かどうかを常に考慮してください ( :nmapvs. :noremap、後者を好む)。

于 2012-10-18T11:40:06.007 に答える
4
:help map-overview

map (および noremap) は、通常、ビジュアル、選択、およびオペレーター保留モード用です。

于 2012-10-18T11:10:57.057 に答える
0

予想に反して、実際にはすべてのモードに当てはまるわけではnoremapありません。mapの非常に役立つ要約に基づいて、 、、、の前に (または の場合は後ろに):help map-listing付けることができる文字と、それらが適用されるモードのリストを次に示します。!mapnoremapunmapmapclear

  • (なし) – 通常、ビジュアル、選択、およびオペレーター保留中
  • 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)。正直なところ、この方法でキー マッピングを使用してコマンドを実行するのは、ちょっとしたハックのように思えますが、別の方法は知りません。

于 2014-03-01T12:50:33.580 に答える