動作の原因
左矢印を押すと、端末は次のエスケープシーケンスを送信します。
ESC O D
これはとして表記することもできます^[OD
。^[
はの表記でCtrl-[
、ESC文字を表記または入力するもう1つの方法です。(挿入モードで試してください!)
Vimはこれをエスケープシーケンスとして認識していないため、キーストロークを自分で入力したかのように処理しています。
- Esc:挿入モードを終了、
- O:カーソルの上で新しい行を開始し、挿入モードに入ります、
- D: 'D'文字を入力してください。
あなたは、これはあなたの端末が挿入モードを入力することによって送信された後、プレスするものであることを確認することができますCtrl-Vが続くLeft矢印。
どうしたの
エスケープシーケンスがタイムアウトしている可能性があります
唯一の Vimは、手動で入力したのと同じ3つの文字からエスケープシーケンスを区別できるような方法は、各文字の受信との間で発生する時間です。したがって、遅い端末や非常にビジーなシステムでは、Vimがエスケープシーケンスではないと判断し、上記のようにキーストロークを解釈するだけで、各文字間に十分な遅延がある可能性があります。
これについては:help vt100-cursor-keys
、さらに詳しく説明します。:help timeout
推奨される解決策は、を十分に大きく設定することttimeoutlen
ですが、両方notimeout
を設定してタイムアウトを完全に無効にするnottimeout
こともできます。
ただし、設定を考えると、これが問題になることはほとんどありません。
Vimはシーケンスを認識しません
問題は、Vimが送信されたエスケープシーケンスを認識せず、キーストロークとして解釈することである可能性が高くなります。これは次のコマンドで確認できます。
:set <left>?
現在の端末構成での作業セットアップでは、次のいずれかの出力が得られます。
t_kl <Left> ^[O*D
t_kl <Left> ^[OD
他に何かが表示された場合1、Vimとターミナルは同じ言語を完全に話していません。
これを修正する正しい方法は、端末構成を修正して、矢印キーを押したときに実際に送信されるシーケンスをterminfoデータベースが報告するようにすることですが、そうすることは複雑になる場合があります。少しハックな修正は、Vimが期待しているものと一致するように端末が送信するものを変更することです。デフォルトのMac Terminal.appを使用しているとあなたのコメントから推測します。環境設定→プロファイル→プロファイル→キーボードで、キーストロークごとに送信されるエスケープシーケンスを変更できます。
ただし、最も簡単な解決策は、Vimに直接どのエスケープシーケンスを期待するかを通知することです。これを行うには、ターミナルオプションを次のように設定します。
set <up>=^[OA
set <down>=^[OB
set <right>=^[OC
set <left>=^[OD
^[
上記のはリテラルESC
文字であることに注意してください。入力した^後に[!を入力することはできません。マッピングを入力する最も簡単な方法は、例えば
set <left>=
次に、まだ挿入モードで、を押しCtrl-Vてからleft矢印を押します。次に、エスケープシーケンスを、矢印キーを押したときにVimが受け取るものに直接設定することに注意してください。
1:考えられる可能性の1つは、CSIシーケンスです。^[[D