12

挿入モードでも機能させたい通常モードコマンドへのマッピングを使用します。これは<C-o>、挿入モードマッピングに追加することで実行できます。

nmap <C-Up> 10<Up>
imap <C-Up> <C-o>10<Up>

ただし、これは各マッピングを2回繰り返すことを意味します。繰り返しを避けるために、他のキーを「オーバーロード」してから、モード固有の部分に使用しようとしました。

" F12 selects prefix suitable for current mode
nmap <F12> <Nop>
imap <F12> <C-o>
" single mapping relying on "overloaded" F12 
map <C-Up> <F12>10<Up>

なんらかの理由で動作しません。挿入モードのF2は<F2>、テキストとして挿入するだけです。何が問題で、どのように修正するのか、何か考えはありますか?ソリューションをビジュアルモードに拡張できる場合のボーナスポイント。

4

4 に答える 4

12

ZyXがすでに指摘しているように、:mapほとんどの場合意味がないため、すべてのモードに単一のコマンドはありません。本当にすべてのモードのマッピングを定義したい場合は、:map:map!;の両方を使用してください。を参照してください:help map-modes

通常、マッピングを定義するのは1回だけなので.vimrc、少しの重複についてはあまり心配しませんが、そうする場合は、ラッパー関数を使用してこれを回避できます。

function! MapBoth(keys, rhs)
    execute 'nmap' a:keys a:rhs
    execute 'imap' a:keys '<C-o>' . a:rhs
endfunction
call MapBoth('<C-Up>', '10<Up>')
于 2012-12-13T07:18:25.003 に答える
11

オリジナル


nnoremap <F2> :w<CR>
inoremap <F2> <Esc>:w<CR>a

mapすべてのモードに設定されない場合があります。正確な理由はわかりません。そのため、構成ファイルにすべてのマッピングを明示的に設定したいと思います。モードが異なるために予期しないことが発生する場合があるので、同じようにすることをお勧めします。そのため、特定のモードごとに行うすべての再マッピングを慎重に検討することが重要です。

さらに、再帰的マッピングは、特に初心者にとって、エラーの既知の原因であるため、可能な限りどこでも*noremapコマンドを優先します。*map

最後に、ビジュアルモードでファイルの書き込みをバインドすることで何を達成しようとしているのかわかりません。部分的なバッファ書き込みを目指していますか(ビジュアルモードで何かを選択し、このファイル書き込みショートカットを押すと、選択したテキストのみが書き込まれます)?または、ファイル書き込みショートカットを押したときに何かを選択したかどうかに関係なく、ビジュアルモードのときにファイル全体を書き込みたいですか?それに関する詳細情報を提供してください。個人的には、どちらの場合も、実際にはインデントされていないため、ビジュアルモードのマッピングは奇妙です。そのようなものを通常モードに保つ方がかなり良いです。

アップデート


他の人があなたの質問にすでに徹底的な答えを与えているので、私はちょうど私の2セントを追加するならそれが役立つだろうと思いましたが、わずかに異なる方向です。あなたがやろうとしていること、つまり挿入モードでの矢印キーを含むナビゲーション機能のマッピングを見ると、あなたはVimに非常に慣れていないことがわかります。おそらくすでにご存知のように、Vimの背後にある哲学は、Vim内での作業中は決してマウスに触れてはならないということです。これを一種の黄金律と呼んください

私が今指摘したいのは、私がシルバールールと呼んでいるものであり、基本的には次のようになります。

noremap <Up>    <Nop>
noremap <Down>  <Nop>
noremap <Left>  <Nop>
noremap <Right> <Nop>

inoremap <Up>    <Nop>
inoremap <Down>  <Nop>
inoremap <Left>  <Nop>
inoremap <Right> <Nop>

つまり、矢印キーを使用しないようにします(コマンドラインモードを除くすべての場所)。指は常に文字キーの領域にのみある必要があります。Vimはモードがすべてです。挿入モードはナビゲーション用ではありません-入力のバーストを対象としています。コードまたはテキストのみ(関係ありません)で作業する場合、ほとんどの時間を通常モードで過ごします-ナビゲート-ファイルを調べ、何かを編集するために次にどこに着陸するかを探し、何かを追加します。挿入モードに切り替える入力バースト。終了したら、通常モードに戻って、捕食者のような肉を探します。:)

それで、それはすべてについて何ですか?最初から正しい方向に向かっていきたいと思います。このようにして、Vimの中間ユーザーになることができます-ほんの数日です。前述のすべてをよりよく理解するために、DerekWyattによるVimNoviceビデオチュートリアルを必ずご覧になることをお勧めします。DerekWyattは、これらすべてについて詳細に説明し、スクリーンキャストで実際に動作していることを示しています。彼による中級および上級のチュートリアルもあり、基本に慣れているときにも見ることができます。

私はあなたに幸せなvimmingを望みます!:)

于 2012-12-13T00:37:45.373 に答える
7

すべてのモードのマッピングを定義するコマンドはありません:map。ドキュメントに明確に記載されている、通常モード、オペレーター保留モード、および視覚モード(実際には視覚的で一度に選択)のマップです。すべてのモードで同じマッピングを使用することは意味がありませんが、移動モードとは異なり、保存はまったく同じrhsのすべてのモードで実行できます。

function s:Save()
    update
    return ''
endfunction
noremap  <expr> <F2> <SID>Save()
noremap! <expr> <F2> <SID>Save()

noremap!もう1つのマルチモードマッピングコマンドです。挿入モードとコマンドモードについて説明します。<SID>Save()関数(textlock)からカーソルを移動することはできないため、この方法はカーソル移動コマンドには適用できませんが、同じことを2回繰り返さないように変数を使用できます。

let s:tendownlhs='10j'
execute ' noremap <C-Down>      '.s:tendownlhs
execute 'inoremap <C-Down> <C-o>'.s:tendownlhs

。これはトリッキーでおそらく役に立たないため、コマンドモードがなくなりました。

于 2012-12-13T04:07:22.367 に答える
3

forマッピングが通常モードで終了しても問題がない場合は、ループと<C-\><C-n>マッピングを組み合わせることができます。<C-\><C-n>任意のモードから通常モードに切り替えます。

たとえば、これにより、Alt- {h、j、k、l}を使用して任意のモードからペインを切り替えることができます。

for map_command in ['noremap', 'noremap!', 'tnoremap']
  execute map_command . ' <silent> <M-h> <C-\><C-n><C-w>h'
  execute map_command . ' <silent> <M-j> <C-\><C-n><C-w>j'
  execute map_command . ' <silent> <M-k> <C-\><C-n><C-w>k'
  execute map_command . ' <silent> <M-l> <C-\><C-n><C-w>l'
endfor
  • noremap通常、視覚、およびオペレーター保留モードのマップ
  • noremap!挿入モードとコマンドモードのマップ
  • tnoremapNeovimのターミナルモードのマップ
于 2017-04-24T19:06:33.653 に答える