xtermスタイルの端末は、、、、、、、およびのそれぞれUpに対して2つの異なるシーケンスを送信します。「通常のカーソルキー」モードでは、シーケンスは(ESC )で始まります。「アプリケーションカーソルキー」モードでは、シーケンスは(ESC )で始まります。のシーケンスはで終了するため、「通常のカーソルキー」モードと「アプリケーションカーソルキー」モードになります。DownRightLeftHomeEnd^[[
[
^[O
O
EndF
^[[F
^[OF
tmux 1.8はデフォルトでこれらのシーケンスの両方を認識するため、特別なことをする必要はありません。tmux1.8がxtermスタイルHomeとEndシーケンスを確実に認識します(つまり、terminal-overrides
以下で説明するハックは必要ありません)。
この投稿の残りの部分では、これらのキーを1.8より前のtmuxバージョンで機能させる方法について説明します。
1.8より前のバージョンのtmuxEndは、接続された端末のterminfoエントリの機能で提供されるシーケンス( tmuxセッションkend
に接続するときにTERMによって指定される)を確認した場合にのみ認識します。デフォルトでは、tmuxはクライアント端末を「通常のカーソルキー」モード1に切り替えます。これは、端末が「通常のカーソルキー」シーケンスを送信するため、tmuxが認識しないことを意味しますが、 tmuxは「アプリケーションカーソルキー」シーケンス(から)のみを認識します。Endkend
基本的に、tmuxはそれを期待しているようでHome、Endカーソルキーモードの影響を受けません。このxtermスタイルの端末との非互換性により、キーが正しく認識されません2。
ここには、これが起こっていることを確認するために使用できる一種の抜け穴があります。アクティブなペインで実行tput smkx
(またはEmacsまたはVimを起動)します。そのペインがアクティブである限り、tmuxはとを認識HomeしEndます。これはsmkx
、シーケンスをtmuxに送信して、クライアントに送信smkx
するために発生します(これにより、クライアントが「アプリケーションカーソルキー」モードに切り替わり、のシーケンスが送信され、tmuxHomeはおよびからのシーケンスと照合できるようになります。Endkhome
kend
)。ただし、これはあまり良い回避策ではありません。「アプリケーション」と「通常」の状態は、インタラクティブプログラムまたはフルスクリーンプログラム(EmacsやVimなど)が開始/再開および終了/一時停止するときにも設定およびリセットされるためです。
より良い回避策は、tmuxのオプションを使用して「通常の」シーケンスterminal-overrides
に変更kend
(および)し、およびから「アプリケーションカーソルキー」の変更を削除することです(「アプリケーションカーソルキー」モードへの切り替えを防ぐために、現在認識されていない)シーケンス)。矢印キーは特別にサポートされているため、常に認識されます(xtermスタイルのシーケンスを想定)。tmuxへの接続に使用している場合は、( )でこれを行うことができます。khome
smkx
rmkx
HomeEndTERM=xterm=256color
~/.tmux.conf
set-option -ga terminal-overrides ',xterm-256color:kend=\E[F:khome=\E[H:smkx=\E=:rmkx=\E>'
(注:terminfoエントリがtmuxxterm-256color
によって処理される方法のため、オーバーライドを有効にする前に、既存のすべてのクライアントを切断する必要があります。また、上記の値smkx
とrmkx
使用される値は、キーパッドモードシーケンスがカーソルキーの後に残るすべてであることを前提としていますモードシーケンスはそれぞれから削除されました。)
最終的に、これはおそらくtmuxのバグです。おそらくどちらか
- 通常モードとアプリケーションモードの両方のシーケンスを認識するために矢印キーが取得する特別なサポートに含めるHome、またはEnd
- 常にクライアント端末を「キーボード送信」モードにし
TERM=screen
、ペインが通常カーソルまたはアプリケーションカーソルまたはキーパッドモードを要求したかどうかに応じて、適切なシーケンスを送信します3。
1実際には、terminfo機能rmkx
(「キーボード送信モードの終了」)を送信します。これは、xterm
terminfoエントリと同様に、「通常のカーソルキー」モードと「通常のケイパッド」モードに切り替わります。
2^[[F
シーケンスは単一のキーとして認識されないため、最終的に2つの「キーの組み合わせ」として処理されます: ^[[
(ESC [
、として扱われますM-[
)、およびプレーン F
。
3改訂管理履歴は、この方法(常にキーボード送信モードで、各ペインのカーソル/キーパッドモードをエミュレートする)が過去のある時点で使用されたことを示しています。なぜ現在の動作に変更されたのかわかりません(アクティブなペインのキーパッドモードを追跡します)。このアプローチには問題があった可能性があります。