tmuxはペインごとのタイトルをサポートしていますが、これらのタイトルを表示するためのペインごとの場所は提供していません。
エスケープシーケンスESC ]2;
…ESCを使用してペインのタイトルを設定できます\
(たとえば、tmuxのマンページの「名前とタイトル」というセクションを参照してください)。次のようにシェルからこれを行うことができます:
printf '\033]2;%s\033\\' 'title goes here'
各ペインのタイトルは、デフォルトでシステムのホスト名になります。デフォルトでは、アクティブなウィンドウのタイトルがの右側に表示されtmuxはのステータス行(セッション変数のデフォルトのグローバル値がstatus-right
あり"#22T" %H:%M %d-%b-%y
、これはショーウィンドウのタイトル、時間、日付の22文字)。
したがって、アクティブなペインのタイトルを表示できることに満足している限り(つまり、非アクティブなペインのタイトルを表示するためにペインを切り替えてもかまいません)、デフォルトの機能を使用できます。各ペインのメインコマンドを開始する前に、適切なタイトル設定エスケープシーケンスを送信するだけです。
ペインごとの情報を表示するための専用行がどうしても必要な場合は、ネストされたtmuxセッションは、最初に考えるほど(不要な)「やり過ぎ」ではない可能性があります。
一般的なケースでは、特定の端末に違反ステータス回線を提供するには、元の端末と新しい端末(回線が1つ少ない端末)の間に配置される完全な端末(再)エミュレータが必要になります。このような(再)エミュレーションは、内部端末に送信された制御シーケンスを変換し、元の端末に変換するために必要です。たとえば、外部端末の下部にステータスラインを維持するには、次のコマンドを実行します。
最後の行に移動します。
内部端末に送信される必要があります
最後から2番目の行に移動します。
変換されて外部端末に送信されたとき。同様に、内部端末に送信されるLFは次のようになります。
カーソルが最後から2番目の行にある場合は、この行とその上のすべての行を1行上にスクロールして、最後から2番目の行を明確にします(最後の行のステータス行を保護します)。それ以外の場合は、LFを送信します。
外側の端子に。
tmuxやscreenのようなプログラムは、まさにそのような端末の再エミュレーターです。確かに、ターミナルエミュレーターには他にも多くの機能がラップされていますが、信頼できるステータス行を提供するためだけに、ターミナルエミュレーションコードの大きなチャンクが必要になります。
ただし、軽量のソリューションがある限り、
- プログラム(Node.jsインスタンス)は、プログラムが実行されているペインとの端末の相互作用が制限されており(つまり、カーソルの位置がありません)、
- プログラムの実行中は、ペインのサイズを変更しません。
多くのターミナルエミュレーターと同様に、tmuxはペインで「setscrollingregion」ターミナルコントロールコマンドをサポートしています。このコマンドを使用して、スクロール領域を端末の上部(または下部)の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