tmuxはペインごとのタイトルをサポートしていますが、これらのタイトルを表示するためのペインごとの場所は提供していません。
]2;
エスケープ シーケンス ESC … ESCを使用してペインのタイトルを設定できます\
(たとえば、tmuxマンページの名前とタイトルのセクションを参照してください)。次のようにシェルからこれを行うことができます。
printf '\033]2;%s\033\\' 'title goes here'
各ペインのタイトルは、デフォルトでシステムのホスト名になります。デフォルトでは、アクティブなペインのタイトルはtmuxステータス ラインの右側に表示されます (セッション変数のデフォルトのグローバル値はstatus-right
、"#22T" %H:%M %d-%b-%y
ペインのタイトル、時間、および日付の 22 文字を示す です)。
したがって、アクティブなペインのタイトルを表示できることに満足している限り (つまり、非アクティブなペインのタイトルを表示するためにペインを切り替えても構わないと思っている場合)、デフォルトの機能を使用できます。各ペインのメイン コマンドを開始する前に、適切なタイトル設定エスケープ シーケンスを送信するだけです。
ペインごとの情報を表示するために専用の行が絶対に必要な場合、ネストされたtmuxセッションは、最初に考えるほど (不要な) 「やり過ぎ」ではない可能性があります。
一般的なケースでは、特定の端末に違反しないステータス行を提供するには、元の端末と新しい端末 (行が 1 つ少ない端末) の間に完全な端末 (再) エミュレーターが必要になります。このような(再)エミュレーションは、内部端末に送信された制御シーケンスを翻訳し、元の端末用に翻訳するために必要です。たとえば、外部端末の下部にステータス ラインを維持するには、次のコマンドを実行します。
最後の行に移動します。
内部端末に送信される必要があります
最終行の次の行に移動します。
変換されて外部端末に送信されるとき。同様に、内部端末に送信される LF は次のようになる必要があります。
カーソルが最終行の次の行にある場合は、この行とその上のすべての行を 1 行上にスクロールして、最終行の次の行を明確にします (最終行のステータス行を保護します)。それ以外の場合は、LF を送信します。
外のターミナルで。
tmuxやscreenなどのプログラムは、まさにそのような端末再エミュレーターです。確かに、ターミナル エミュレータには他にも多くの機能がラップされていますが、信頼できるステータス ラインを提供するためだけに、大量のターミナル エミュレーション コードが必要になります。
ただし、軽量のソリューションが存在する限り、
- あなたのプログラム ( Node.jsインスタンス) は、それらが実行されているペインとの端末の対話が制限されています (つまり、カーソルの位置がありません)。
- プログラムの実行中にペインのサイズを変更しないでください。
多くの端末エミュレーターと同様に、tmuxはそのペインで「スクロール領域の設定」端末制御コマンドをサポートしています。このコマンドを使用して、スクロール領域を端末の上部 (または下部) N-1 行に制限し、ある種のインスタンス識別テキストを非スクロール行に書き込むことができます。
出力を生成しているプログラム ( Node.jsインスタンスなど) は、スクロールが特定の領域に制限されていることを認識していないため、制限 (カーソル移動コマンドは許可されず、サイズ変更も許可されません) が必要です。出力生成プログラムがたまたまスクロール領域の外にカーソルを移動した場合、出力が文字化けする可能性があります。同様に、ターミナル エミュレータは、ターミナルのサイズが変更されると、スクロール領域を自動的にリセットする可能性があります (そのため、「非スクロール行」はスクロールして離れてしまう可能性があります)。
tput
適切な制御シーケンスを生成し、非スクロール行に書き込み、カーソルをスクロール領域に移動した後にプログラムを実行するために使用するスクリプトを作成しました。
#!/bin/sh
# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
# Set up a non-scrolling line at the top (or the bottom) of the
# terminal, write the given text into it, then (in the scrolling
# region) run the given command with its arguments. When the
# command has finished, pause with a prompt and reset the
# scrolling region.
get_size() {
set -- $(stty size)
LINES=$1
COLUMNS=$2
}
set_nonscrolling_line() {
get_size
case "$1" in
t|to|top)
non_scroll_line=0
first_scrolling_line=1
scroll_region="1 $(($LINES - 1))"
;;
b|bo|bot|bott|botto|bottom)
first_scrolling_line=0
scroll_region="0 $(($LINES - 2))"
non_scroll_line="$(($LINES - 1))"
;;
*)
echo 'error: first argument must be "top" or "bottom"'
exit 1
;;
esac
clear
tput csr $scroll_region
tput cup "$non_scroll_line" 0
printf %s "$2"
tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
get_size
clear
tput csr 0 $(($LINES - 1))
}
# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2
# Run something that writes into the scolling region
"$@"
ec=$?
# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling
exit "$ec"
次のように使用できます。
tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'
スクリプトは、端末がその機能とterminfo 機能をサポートおよび公開している限り、 tmuxの外部でも動作するはずです。csr
cup