web-dev-qa-db-ja.com

フォーカスが失われたときに「^ [[O」と「^ [[I」がiTerm2に表示される

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

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

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

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

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

26
osyoyu

this によると:

フォーカスの喪失/獲得を報告するためのサポートを追加します。 esc [?1004hをオンにします。次に、端末は、フォーカシング時にesc [I、デフォーカス時にesc [Oを送信します。無効にするには、esc [?1004lを送信します。

Cmd-R リセットすると、フォーカスレポートがオフになります(ありがとう this

28
Yichuan Wang

私はこの回答をテストするのに便利なMacを持っていませんが、LinuxのXTermでこの問題が非常にまれに発生します。

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

printf "\e[?1004l"

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

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


Linuxでは、この制御シーケンスを次の手順で示すことができます。

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

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

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

11
Paul Whittaker

「フォーカス」という用語は、どの端末(またはウィンドウ)が現在キーボードとマウスの入力イベントを受け入れているかを示します。フォーカスを持つことができるのは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互換端末で機能します 1つの設定での「xterm」マウス機能の動作:

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

つまり、端末がxtermマウスプロトコルを使用しないことをvimに伝えることで、thatを無効にすることができます。引用されたパッチはvimにFocusIn/FocusOut機能をオンにするように指示します(通常はオフにする必要があります)。そのロジックに欠陥がある場合、vimの終了後も機能を有効のままにしておくことができます。

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

2
Thomas Dickey

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

0
Hayaki Saito