回答:
あなたのマッピングは、それがするべきことをしないか、予想とは異なる動作をします。それを解決するためにいくつかのステップに従う必要があります:
Vimはコマンドを提供します:map
。デフォルトでは(引数が指定されていない場合)、コマンドは現在作成されているすべてのマッピングを表示します。コマンドの結果の例を次に示します。
いつものように、ドキュメントはあなたの友達です: :h map-listing
最初の列にはマッピングのモード(n
通常モード、
v
視覚モードなど)、2番目の列にはマッピングされたキー、最後の列にはキーのマッピング先が表示されます。マップされたアクションの前にいくつかの追加の文字が表示される前に、それらを理解することが重要であることに注意してください。
*
再マップできないことを示します(つまり、再帰的なマッピングではありません。know when to use nore
この回答の後半を参照してください)&
スクリプトローカルマッピングのみが再マップ可能であることを示します@
バッファローカルマッピングを示しますマッピングについての助けを求めるとき、他の人があなたのマッピングの振る舞いを理解するのを助けることができるので、この情報を追加することは良いことです。
の姉妹のコマンドを使用して、特定のモードにプロンプトを制限することが可能である:map
ような、:vmap
、:nmap
、:omap
など、
問題のあるマッピングに検索を制限するために、次のようにコマンドのパラメーターとしてデバッグしているキーシーケンスを渡すことができます。
:map j
:map <Leader>m
:map <F5>
<Leader>
キーはリスト内の実際の値に置き換えられることに注意してください。
コマンドの結果、キーが正しくマップされていることが示された場合、おそらく、問題はVimからではなく、ターミナルまたはデスクトップ環境から発生したことを意味します。マッピングが実際にVimによってインターセプトされているかどうかを確認するの部分を参照してください
コマンドの結果がキーが正しくマップされていないことを示している場合、次の部分を参照してください。
この:map
コマンドのもう1つの便利な使用法は、次のコマンドと組み合わせることverbose
です。これにより、マッピングを変更した最後のファイルが要求されます。
たとえば、次の2つのスクリーンショットを参照してください:verbose map
。1つ目はmyによって変更されたマッピング.vimrc
で、2つ目はプラグインによって作成されたマッピングです。
別のスクリプトがマッピングを変更したことがわかった場合、それを削除するか、その動作を変更できるかどうかを確認する必要があります。(一部のプラグインはマッピングを有効/無効にする変数を提供しますが、残念ながらすべてのプラグインがそれを行うわけではありません)
マッピングを変更した最後のファイルがの場合、.vimrc
同じキーのマッピングも定義する他の行がないことを確認してください。.vimrc
ファイルは喜んファイルでは、その種の最後の1を持つすべてのマッピングを上書きします。
いくつかの状況は、Vimがキーをインターセプトしないことを示す場合があります。
:map
は、キーが正しくマップされていることを示していますが、それを押しても何も起こりません。おそらく、次の2つのいずれかが原因です。
Vimの前に何かがインターセプトされます:OS、デスクトップ環境、ターミナルエミュレーター、Tmux(使用する場合)...
これをトラブルシューティングするには、次のことを行う必要があります。
.tmux.conf
tmuxを使用する場合は、一時的に削除してみてくださいスーパーユーザー、 Unix、Linux、askUbuntuなどの姉妹サイトを参照することもできます。
これが問題である場合は、2つの解決策があります。問題の原因となるアプリケーションの動作を変更するのに(多くの)時間を費やすか、別のアプリケーションによってインターセプトされないマップへの別のキーの組み合わせを見つけます。
ターミナルエミュレータは、マッピングしようとしているキーの組み合わせを処理できません。ターミナルエミュレータは異なる方法で実装されており、特定のキーの組み合わせを処理できないものもあります。(できない理由は、この質問の範囲外です。詳細については、前述のドキュメントまたは姉妹サイトをご覧ください)
この場合、多くの解決策はありません。端末で適切に処理される別の鍵にキーを変更するか、端末エミュレータを変更します。
マッピングにおけるいくつかの問題はかなり再発しており、ほとんどがvimscript構文に関連しています。マッピングに予期しない動作がある場合は、次の点を確認してください。
マッピングと同じ行にコメントを入れないでください。代わりに、上の行にコメントを入れてください。例:
それをしないでください:
inoremap ii <esc> " ii to go back into normal mode
Vimは、空白、"
コメント、コメントをマッピングの一部と見なし、予期しない動作を引き起こします。
その代わりに:
" ii to go back into normal mode
inoremap ii <esc>
これは読みやすく、マッピングを混乱させません。
それをしないでください:
nnoremap <Leader>x :w | !% python -m json.tools
Vimはパイプ|
をコマンド終了と見なします。ソースを.vimrc
作成nnoremap <Leader>x :w
すると、マッピングが作成され、外部コマンド!% python -m json.tools
が実行されます。
その代わりに:
nnoremap <Leader>x :w <bar> !% python -m json.tools
の説明を<bar>
参照してください。
いつ使用するかを知ってくださいnore
:常に。
LearnVimscriptTheHardWayかなり明確にそれを説明:使用することはありませんmap
、nmap
、vmap
、等...常にNOREバージョン好む:noremap
、nnoremap
、vnoremap
、など...なぜ?マッピングのnore
略で、non-recursive
マッピングを変更した場合でも、マッピングの右側が組み込み機能と見なされることを意味します。例:
>
行を削除し、行-
のインデントをインクリメントするようにマッピングするとします。非再帰的なマッピングを使用しない場合は、次のようにします。
(例のためにそれをしないでください)
nmap > dd
nmap - >
ヒット>すると行が削除されますが、それは良いことです。ただし、ヒット-すると行はインデントされずに削除されます。どうして?Vimが「私-
が翻訳すべきヒットを受け取ったので、それを翻訳すべきだ」と理解した>
からdd
です。
代わりに
nnoremap > dd
nnoremap - >
この方法では、Vimは翻訳する-
よう>
およびための任意の他の翻訳をしようとしませんnore
。
編集ノート「常に」は、再帰的なマッピングフォームを使用する必要がある場合に誇張された回答になる場合がありますが、実際には一般的ではありません。明確にするために、私はこの答えから@romainlを引用します:
再帰マッピングを使用するのは、マッピングで他のマッピングを使用する場合のみです。使用しない場合は、非再帰的なマッピングを使用してください。
いくつかのキーの組み合わせは同等であることを忘れないでください。生成される16進コードのため、いくつかのキーの組み合わせはVimによって別のキーとして解釈されます。例えば
<C-h>
に等しい <backspace>
<C-j>
なので <enter>
<M-a>
は、á
すべての<m-
マッピングと同じ
です。@LucHermitteがコメントで指摘したように、vim-latexのようなこのタイプのマッピングを使用するプラグインの問題である。<C-S-a>
はと同等
<C-a>
です。端末がASCIIコードを送信する方法の原因として、Ctrl +大文字とは別にCtrl +大文字をマッピングすることは不可能です。マッピングが別のキーに影響を与えると思われる場合は、別のlhsの組み合わせを使用してみてください。問題が解決する場合は、Vimに送信される16進コードを調べます。
リーダーが正しく定義されていることを確認します。関連するマッピングが<leader>
機能せず、コマンドmapleader
でリーダーを変更した場合、リーダーの定義がマッピングの定義の前に行われていることを確認します。そうでない場合、Vimは、あなたが考えているものではないキーを使用してマッピングを作成しようとします。また、スペースバーをリーダーとして使用する場合(これはかなり新しい)、正しい表記を使用していることを確認してください。let mapleader = "\<Space>"
この回答のすべてのステップを実行してもマッピングが希望どおりに機能しない場合は、おそらくこのサイトで助けを求めることができます。
次のような重要な情報を提供することを忘れないでください。
問題の正確な説明:
「機能しません」は、あなたを助けようとする人々にとっては本当に役に立ちません。マッピングが何もしない場合、または予想とは異なる動作をする場合は、正確にする必要があります。
:map
と:verbose map
これにより、サイトのユーザーとユーザーの時間を大幅に節約できます。
:unmap
Vimを終了せずにマッピングをリセットすると、その動作のデバッグに役立つ場合があります。
これを行うには、通常モード、視覚モード、および動作保留モードに:unmap <key>
割り当てられたマッピングを削除するコマンドを使用でき<key>
ます。:iunmap
挿入モードのマッピングを削除します。他のモードについてはをご覧ください:help :unmap
。
マッピングの優れた紹介:learnvimscriptthehardway(およびVimの他の多くの側面)
ドキュメント::h mapping
、
:h :map
VimのFAQのセクション20はマッピングに関するもので、興味深い質問が含まれています。
<m-i>
およびé
vimでも同じです。すべてのmeta + keyでも同じです。それらは異なる発音区別記号に関連付けられています。
:map {sequence}
がある->で定義を求めるときに、バッファローカルマッピングを読み取る方法を知ることも重要*
です。
:debug normal {keysequence}
(任意の強打なし)、または:debug i{keysequence}
キーシーケンスは、特殊キーのようなもの(含まれている場合など、挿入モードのマッピングのために<cr>
、<left>
、<c-x>
、<m-i>
、<leader>
...)を。次に、execute +ダブルクォート+バックスラッシュ->で遊ぶ必要があります:debug execute "normal \<leader>\<cr>Z"
。
<m-i>
。ほとんどのユーザーは、ターミナルでVimを実行することに強い指向があるため、メタキーを使用しません。この問題に気付くには、gvimまたはmacvimを使用する必要があります。
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
、私の質問の最初の行で述べたように、これらの理由を集めることで、マッピングに関する重複する質問の数を減らすことができるはずです。