「^ [[O」および「^ [[I」がフォーカスを失ったときにiTerm2に表示される


23

YosemiteでiTerm2 2.1.1を使用しています。tmuxはありません。

iTermがフォーカスを失ったとき(Cmd-Tabで別のアプリケーションに切り替えたとき、または別のウィンドウをクリックしたとき)、^[[Iおよび^[[Oは端末に送信されるようです。これにより、^[[I^[[OVimでa が表示されるか、よりイライラさせられます。この組み合わせにより、別の小さなバッファーが開かれます。

サンプル:起動後にCmd-Tabを数回押す cat

% cat
^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I^[[O^[[I

これはiTermでのみ発生し、Terminal.appでは発生しません。また、bashまたはshで再現されるため、zshの問題ではないようです。一部のグーグルは、これが「フォーカス」問題であると示唆しましたが、端末の意味で「フォーカス」とは何ですか、これを無効にするか、回避する方法はありますか?


これは、Vimで日本語を書いているときに再現するようですが、原因は何なのかまだ
わかり

回答:


25

よると、この

フォーカスが失われた/得られたという報告のサポートを追加します。esc [?1004hはそれをオンにします。次に、端末は、焦点を合わせるときにesc [I、焦点をぼかすときにesc [Oを送信します。無効にするにはesc [?1004lを送信します。

Cmd- Rリセットすると、フォーカスレポートがオフになります(これに感謝します


1
Cmd-R私にとって魔法のシーケンスです
-bruceg

とても助かります、ありがとう。これは、GoogleのSEOを見つけるのに長い時間がかかりました:mac iterm iterm2クリップボードの内容vim exバッファーフォーカス
bsb

11

この答えをテストするのに便利なMacはありませんが、LinuxのXTermでこの問題が発生することは非常にまれです(iTerm2が同じ制御コードを尊重していると仮定すると)、以下の修正が役立つ場合があります。

問題が発生しているターミナル内で次のシェルコマンドを実行します。

printf "\e[?1004l"

(最後の文字には小文字の「エル」があることに注意してください。)

このANSI制御シーケンスは、Thomas Dickeyの回答にリストされているものと似ていますが、機能を(オンではなく)オフにします。文字がまったく発生しないようにすることで、Vimだけでなく、すべてのアプリケーションの問題を解決するはずです。


Linuxでは、この制御シーケンスを次の手順で動作させることができます。

  • 実行xtermして実行して機能を有効にしprintf "\e[?1004h"、それに。
  • 同じXTermから実行xeyesまたは他のGUIアプリケーション。(何らかの理由で、問題のXTermがアプリケーションを起動するまで、この効果は私には起こりません。誰もがその理由を知っていますか?)
  • 繰り返し(例えばウィンドウをクリックすることにより)に、元のxtermからフォーカスを切り替えて見る^[[O^[[I、元のxtermはに「型付け」されています。
  • Xeyesを閉じ、元のXTermに戻って実行しますprintf "\e[?1004l"(上記の修正で説明したように、機能を無効にします)。
  • 上記の「実行xeyes、フォーカスの切り替え」の手順を繰り返しますが、今回はターミナルに文字が入力されていません。

個人的にこの問題は、誤って端末にバイナリ出力をダンプした場合にのみ発生しますが、より頻繁に発生する場合はprintf、シェルの対話型起動スクリプト(例~/.bashrc)に追加することをお勧めします。機能がすでに無効になっている場合、制御コードを送信しても(少なくともXTermの下では)害はないようです。そのため、この問題が時々見られるだけでも安全です。

シェルが常にその出力を生成することを懸念している場合、おそらくそれらの制御コードをうまく処理できない場所でそれを使用する場合や、シェルの起動後に問題がトリガーされる場合がある場合は、設定することをお勧めしますエイリアスを(たとえば、alias focusfix='printf "\e[?1004l"')を使用して、手動で実行する方が便利です。


Manjaro linux、Gnome、ターミネーター、およびoh-my-zshを実行しています。この問題は私に起こっていました、そして、この答えは多くを助けました。
ファビオモンテフスコロ

2

「フォーカス」という用語は、現在どの端末(またはウィンドウ)がキーボードおよびマウスの入力イベントを受け入れているかを示します。1つだけがフォーカスを持つことができます。グラフィカル環境でフォーカスを獲得したり失ったりする方法を確立するためのプロトコルがありますが、探索するのは役に立ちません。

説明から(フォーカスが回復したときのTmuxの現在のペインインジケーターも参照)、iTerm2はこのxterm機能を実装しているようです。

FocusIn / FocusOut

FocusIn / FocusOutは、異なるプロトコルを使用するため、任意のマウスイベントと組み合わせることができます。設定すると、端末がフォーカスを取得するとxtermがCSI Iを送信し、フォーカスを失うとCSI Oを送信します。

プライベートモード1004(2007年にxtermに追加されたパッチ#224)によって有効になります。

CSI ? Pm h
      DEC Private Mode Set (DECSET).
           Ps = 1 0 0 4  -> Send FocusIn/FocusOut events. 

このパッチに関連する可能性があります。Vim-フォーカスレポートモード(DECSET / DECRST 1004)のサポートを追加し、xterm互換端末で動作します。

/ * xterm互換端末とtmuxでフォーカスレポートがサポートされています。* /

そのため、ターミナルがxtermマウスプロトコルを使用しないことをvimに伝えることで、これを無効にすることができます。引用されたパッチは、vimにFocusIn / FocusOut機能(通常はオフになっているはずです)をオンにし、ロジックに何らかの欠陥がある場合、vimを終了した後に機能を有効のままにしておくように指示します。

vimはモードが有効になっている最も可能性の高い原因ですが、他のプログラム(またはスクリプト)がオンになっている可能性があります。別の回答で示唆されているように、scriptプログラムを使用して端末への出力を収集する(typescriptファイルを生成する)ことで、それを絞り込むことができます。分析には時間がかかる可能性があります(また、このサイトは添付ファイルをサポートしていないようであるため、詳細な議論を求めるのには適していません)。私は通常unmap、この目的のためにtypescriptファイルを読み取り可能な形式に変換するために使用します。


詳細な回答をありがとう。Vimでこの問題を無視\e\[Oして\e\[I解決するようにVimに指示しますが、catやinなどの他のアプリケーションrails server(readlineを使用するプログラムかもしれません)ではそうではありません。
しょうゆ

だから...誰もが正確に「Vimに\ e [Oと\ e [I」を無視するように伝える」と言えるでしょうか?
リビンウェン

0

この問題を解決するには、フォーカスレポートモードを有効にするプログラムを知る必要があります。script(1)コマンドで記録されたログを取得する必要があります。


フォーカスレポートは、デフォルトでオフになっている機能で、エスケープシーケンスによってオンになっていますか?実際、この問題は新しいターミナルウィンドウでは発生しないことに気付きましたが、何か行った後に再現するので、それを特定しようとします。
しょうゆ

-2

この質問は、フォーカスが失われたときに「^ @」と表示されている端末を解決しようとすることで見つけました。

回答を読んで、iTerm2の設定->プロファイル->「デフォルト」->セッションに移動して、「アイドル状態の場合、60秒ごとにASCIIコード0を送信」を試みました。

問題が解決し、誰かの助けになることを願っています

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