マッピングをデバッグする方法は?


66

ユーザーが機能しないマッピングを持っている場合、ここで多くの質問を目にします。ほとんどの場合、理由はかなり似ています。

この質問をこの種の質問のリファレンスにして、マッピングをデバッグするための完全な手順を示すことをお勧めします。ユーザーがマッピングに問題がある場合、ここでリダイレクトして、最も一般的な問題を排除できます。

もちろん、専用の質問を必要とする特定のケースがまだあり、ここでは対処しません。

回答:


89

あなたのマッピングは、それがするべきことをしないか、予想とは異なる動作をします。それを解決するためにいくつかのステップに従う必要があります:

キーがすべきことに効果的にマッピングされていることを確認します

Vimはコマンドを提供します:map。デフォルトでは(引数が指定されていない場合)、コマンドは現在作成されているすべてのマッピングを表示します。コマンドの結果の例を次に示します。

<code>:map </ code>の結果

いつものように、ドキュメントはあなたの友達です: :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同じキーのマッピングも定義する他の行がないことを確認してください。.vimrcファイルは喜んファイルでは、その種の最後の1を持つすべてのマッピングを上書きします。

マッピングが実際にVimによってインターセプトされているかどうかを確認します

いくつかの状況は、Vimがキーをインターセプトしないことを示す場合があります。

  • このコマンド:mapは、キーが正しくマップされていることを示していますが、それを押しても何も起こりません。
  • マッピングはgVim(GUI)で機能しますが、ターミナルVimでは何もしません
  • マッピングは定義された端末エミュレーターで機能しますが、別のエミュレーターでは機能しません
  • マッピングは定義されたOSで機能しますが、別のOSでは機能しません。

おそらく、次の2つのいずれかが原因です。

  • Vimの前に何かがインターセプトされます:OS、デスクトップ環境、ターミナルエミュレーター、Tmux(使用する場合)...

    これをトラブルシューティングするには、次のことを行う必要があります。

    • .tmux.conftmuxを使用する場合は、一時的に削除してみてください
    • 端末またはデスクトップ環境のドキュメントを参照してください。

    スーパーユーザーUnix、LinuxaskUbuntuなどの姉妹サイトを参照することもできます。

    これが問題である場合は、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かなり明確にそれを説明:使用することはありませんmapnmapvmap、等...常にNOREバージョン好む:noremapnnoremapvnoremap、など...なぜ?マッピングの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はマッピングに関するもので、興味深い質問が含まれています。

ボーナス:マッピングで使用するキーを見つけるためのベストプラクティスに関する質問


2
モデレーターが提案したように、私の経験を他のユーザーと共有するため。そして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、私の質問の最初の行で述べたように、これらの理由を集めることで、マッピングに関する重複する質問の数を減らすことができるはずです。
statox

1
vim-latexおよびフランス語キーボードで繰り返し発生する問題:<m-i>およびévimでも同じです。すべてのmeta + keyでも同じです。それらは異なる発音区別記号に関連付けられています。
リュックエルミット

1
また、関連するアクションの前にvimが出力する内容に逆のハイライト:map {sequence}がある->で定義を求めるときに、バッファローカルマッピングを読み取る方法を知ることも重要*です。
リュックエルミット

2
時々、実際に何が起こるかをデバッグしたいことがあります。通常、マッピングがプラグマッピング、または覚えにくい名前や複雑なパラメーターを持つ関数を呼び出す場合。そのケースでは、実行することができます:debug normal {keysequence}(任意の強打なし)、または:debug i{keysequence}キーシーケンスは、特殊キーのようなもの(含まれている場合など、挿入モードのマッピングのために<cr><left><c-x><m-i><leader>...)を。次に、execute +ダブルクォート+バックスラッシュ->で遊ぶ必要があります:debug execute "normal \<leader>\<cr>Z"
リュックエルミット

2
メタシーケンスに関して、vim-latexはのようなものを使用することを選択したため、これはFAQの古いポイントです<m-i>。ほとんどのユーザーは、ターミナルでVimを実行することに強い指向があるため、メタキーを使用しません。この問題に気付くには、gvimまたはmacvimを使用する必要があります。
リュックエルミット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.