<Esc>を無効にしますが、<C-[>


24

挿入モードから切り替えるために私は慣れてい<Esc>ます。今、私は<C-[>代わりに自分を再訓練したいと思っています <Esc>。そのため<Esc>、再トレーニングを支援するために無効にする必要があります。

問題は

:inoremap <Esc> <Nop>

も無効にします<C-[>。vimの場合、それらは同じもののようです。

一方を無効にするには他に方法はありますか?


13
作業環境によって異なります。ほとんどのテキスト端末は、Escまたはを押すと同じ情報をアプリケーションに送信するC-[ため、運が悪かったのですが、VimのGUIバージョンを使用するか、端末を再構成することで何かを行える場合があります。
ジル「SO-悪であるのをやめる」

右!vimの問題ではありません。キーボードマッピングの回避策を見つけます。ありがとう
mxlian

3
@Gillesなぜあなたはそれを答えに入れないのですか?我々社員とサイトの統計情報の方が優れています。
ロビーWxyz

2
@SuperScriptこれについてもう少し調べて、回答を投稿しました。
ジル 'SO-悪であるのをやめる'

回答:


35

まず、少し歴史。昔、端末でテキストを入力すると、各キーがアプリケーションに文字を送信しました。端末が接続されているマシンがより強力になると、端末は制御キーで標準化され、印刷されないが何らかの機能を備えた特殊文字を送信します。最終的に勝利した文字セットはASCIIで、128文字のうち32文字が制御文字でした。押圧Ctrl例えばコード00xxxxx₂は制御文字、文字又は他の記号書き込ま10xxxxx₂(バイナリ表記)と一緒に送るCtrl+は、[送信する文字数27₁₀=0011011₂ため[91₁₀=1011011₂あります。

端末のいくつかの機能キーが制御文字を送信しました:

  • Backspace= Ctrl-H(BS = BackSpace)¹
  • Tab= Ctrl-I(HT =水平タブ)
  • Linefeed= Ctrl-J(LF =ラインフィード)(このキーを持つ端末はこれまでほとんどありませんでした)
  • ReturnまたはEnter= Ctrl-M(CR =キャリッジリターン)
  • Escape= Ctrl-[(ESC =エスケープ)

端末にもっと多くのファンクションキーがあると、それらすべてを表すのに十分な制御文字がありませんでした。したがって、文字のシーケンスを送信しました。普遍的な慣例では、これらの文字シーケンスはエスケープ文字で始まりますCtrl-[

時間が経つにつれて、ハードウェア端末はますます希少になりました。現在、キーボードとアプリケーションの間には多くのレベルの翻訳があります。使用可能な文字数の制限、および特定のキーの組み合わせと特定の制御文字間のハードコード化された対応は、もはや関係ありません。ただし、アプリケーションは既存の端末との互換性を維持し、端末は既存のアプリケーションとの互換性を維持しているため、何も変更することが困難でした。

そうであっても、端末エミュレータで実行中のアプリケーションが文字受け取る今日は、Unixライクなシステム上で、Ctrl-Iユーザーが押したTabキーを、文字Ctrl-[のユーザ押すEsc場合はVimはUnixのターミナルで実行されているなど、それは区別できません<Esc>そして<Ctrl-[>、端末は、同じ情報を送信するため。

他の環境で実行されているVimにはこの制限がないため、原則として、異なる情報を送信することが可能です。VimはこのCtrl-[文字を使用<Esc>して多くの場所で表現することを考えると、それを変更することは実用的ではありません。代わりに、異なる入力イベントを送信するようにCtrl+を作成[できます。

EscCtrl+を区別するVim自体のバージョンを認識していません[(ただし、これまで使用したことはありません)。Gvimは、1つには、園芸品種ターミナルエミュレートしているようです。

皮肉なことに、あなたの最善の策は、ターミナルエミュレーターでVimを実行することです。一部のターミナルエミュレータでは、キーとキーコードによって送信されるエスケープシーケンスをカスタマイズできます。したがって、Ctrl+ [Ctrl-[)文字ではなく、エスケープシーケンスを送信するように+ を手配できます。Unixライクシステム用の「リファレンス」ターミナルエミュレータであるXtermは、このような2つのスキームをサポートしています。例えば:

  • Escすべての構成で、send Tabsendを使用します。
  • ?.VT100.modifyOtherKeys: 0(デフォルト)、または?.VT100.modifyOtherKeys: 1Ctrl+は、[送信およびCtrl+ I送信します?.VT100.modifyOtherKeys: 1ASCII文字のないメタの組み合わせと制御の組み合わせにのみ影響します。
  • ?.VT100.modifyOtherKeys: 2and ?.VT100.formatOtherKeys: 0(デフォルト)を使用すると、 Ctrl+ [send ␛[27;5;91~およびCtrl+ Isendになります␛[27;5;105~
  • ?.VT100.modifyOtherKeys: 2?.VT100.formatOtherKeys: 1Ctrl+は、[送信␛[91;5uCtrl+ I送信します␛[105;5u

サポートは、xtermの起動時にmodifyOtherKeys リソースを設定することで(およびformatOtherKeys2つのスキームから選択することで)有効にできます。または、アプリケーションによって動的に有効または無効にできます。

Vimには、私が知っている組み込みのサポートはありません。これらのエスケープシーケンスに対して独自のバインディングを作成できます。modifyOtherKeys変更された端末定義を入力することで、Vimに端末を自動的にモードに設定させることも可能ですが、そうすることはこの回答の範囲外です。

Neovimには、いずれかのバリアントのサポートが組み込まれています。私が理解している限りでは、端末がサポートしている場合、サポートはオンになりません。それはユーザー次第です。

¹最近ではますます一般的に、Backspace文字127が送信されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.