2

たとえば、<End>キーを tmux のプレフィックス キーにバインドしたいとします。

この質問は私の質問に部分的に答えます: HOME キーを tmux プレフィックスとしてバインドするにはどうすればよいですか?

Mac OS 10.8 で bash を使用しています。

変えてみた

set -g prefix C-a 

set -g prefix End

しかし、それはうまくいきませんでした。の結果はtput kend | cat -v ; echo^[OFあり、cat -v(および End キーを押した) の結果は です^[[F

4

1 に答える 1

5

xtermスタイルの端末は、、、、、、、およびのそれぞれUpに対して2つの異なるシーケンスを送信します。「通常のカーソルキー」モードでは、シーケンスは(ESC )で始まります。「アプリケーションカーソルキー」モードでは、シーケンスは(ESC )で始まります。のシーケンスはで終了するため、「通常のカーソルキー」モードと「アプリケーションカーソルキー」モードになります。DownRightLeftHomeEnd^[[[^[OOEndF^[[F^[OF

tmux 1.8はデフォルトでこれらのシーケンスの両方を認識するため、特別なことをする必要はありません。tmux1.8がxtermスタイルHomeEndシーケンスを確実に認識します(つまり、terminal-overrides以下で説明するハックは必要ありません)。


この投稿の残りの部分では、これらのキーを1.8より前のtmuxバージョンで機能させる方法について説明します。


1.8より前のバージョンのtmuxEndは、接続された端末のterminfoエントリの機能で提供されるシーケンス( tmuxセッションkendに接続するときにTERMによって指定される)を確認した場合にのみ認識します。デフォルトでは、tmuxはクライアント端末を「通常のカーソルキー」モード1に切り替えます。これは、端末が「通常のカーソルキー」シーケンスを送信するため、tmuxが認識しないことを意味しますが、 tmuxは「アプリケーションカーソルキー」シーケンス(から)のみを認識します。Endkend

基本的に、tmuxはそれを期待しているようでHomeEndカーソルキーモードの影響を受けません。このxtermスタイルの端末との非互換性により、キーが正しく認識されません2

ここには、これが起こっていることを確認するために使用できる一種の抜け穴があります。アクティブなペインで実行tput smkx(またはEmacsまたはVimを起動)します。そのペインがアクティブである限り、tmuxはとを認識HomeEndます。これはsmkx、シーケンスをtmuxに送信して、クライアントに送信smkxするために発生します(これにより、クライアントが「アプリケーションカーソルキー」モードに切り替わり、のシーケンスが送信され、tmuxHomeはおよびからのシーケンスと照合できるようになります。Endkhomekend)。ただし、これはあまり良い回避策ではありません。「アプリケーション」と「通常」の状態は、インタラクティブプログラムまたはフルスクリーンプログラム(EmacsVimなど)が開始/再開および終了/一時停止するときにも設定およびリセットされるためです。

より良い回避策は、tmuxのオプションを使用して「通常の」シーケンスterminal-overridesに変更kend(および)し、およびから「アプリケーションカーソルキー」の変更を削除することです(「アプリケーションカーソルキー」モードへの切り替えを防ぐために、現在認識されていない)シーケンス)。矢印キーは特別にサポートされているため、常に認識されます(xtermスタイルのシーケンスを想定)。tmuxへの接続に使用している場合は、( )でこれを行うことができます。khomesmkxrmkxHomeEndTERM=xterm=256color~/.tmux.conf

set-option -ga terminal-overrides ',xterm-256color:kend=\E[F:khome=\E[H:smkx=\E=:rmkx=\E>'

(注:terminfoエントリがtmuxxterm-256colorによって処理される方法のため、オーバーライドを有効にする前に、既存のすべてのクライアントを切断する必要があります。また、上記の値smkxrmkx使用される値は、キーパッドモードシーケンスがカーソルキーの後に残るすべてであることを前提としていますモードシーケンスはそれぞれから削除されました。)

最終的に、これはおそらくtmuxのバグです。おそらくどちらか

  • 通常モードとアプリケーションモードの両方のシーケンスを認識するために矢印キーが取得する特別なサポートに含めるHome、またはEnd
  • 常にクライアント端末を「キーボード送信」モードにしTERM=screen、ペインが通常カーソルまたはアプリケーションカーソルまたはキーパッドモードを要求したかどうかに応じて、適切なシーケンスを送信します3

1実際には、terminfo機能rmkx(「キーボード送信モードの終了」)を送信します。これは、xtermterminfoエントリと同様に、「通常のカーソルキー」モード「通常のケイパッド」モードに切り替わります。
2^[[Fシーケンスは単一のキーとして認識されないため、最終的に2つの「キーの組み合わせ」として処理されます: ^[[(ESC [、として扱われますM-[)、およびプレーン F
3改訂管理履歴は、この方法(常にキーボード送信モードで、各ペインのカーソル/キーパッドモードをエミュレートする)が過去のある時点で使用されたことを示しています。なぜ現在の動作に変更されたのかわかりません(アクティブなペインのキーパッドモードを追跡します)。このアプローチには問題があった可能性があります。

于 2013-03-05T08:19:50.890 に答える