103

私のローカル マシンでは、3 つの node.js インスタンスが同時に実行されています。それぞれに、「サーバー」と呼ばれる tmux ウィンドウに独自のペインがあります。問題は、ログが似ているため、どのペインでどのノードが実行されているかを把握するのがそれほど簡単ではないことです。

必要なのは、すべてのペインのタイトルです。私が得たように、tmux 自体にはこの機能はありません。ウィンドウのタイトルのみがあり、ペインのタイトルはありません。すべての node.js インスタンスのすべてのペイン内で個別の tmux セッションを起動するのは、やり過ぎのように見えます。

コマンドを起動し、その出力を指定されたステータス バーでラップする小さなプログラムはありますか?

前もって感謝します

4

10 に答える 10

92

この機能は、このコミットで tmux に追加されました。バージョン 2.2 にはありませんが、2.3 にはなるようです。

有効にするには:

tmux set -g pane-border-status top

または、必要に応じて:

tmux set -g pane-border-status bottom

pane-border-formatカスタム テキストをペインの境界線のステータス ラインとして設定するには、次のように を使用できます。

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"
于 2016-06-02T21:02:26.553 に答える
89

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 を送信します。

外のターミナルで。

tmuxscreenなどのプログラムは、まさにそのような端末再エミュレーターです。確かに、ターミナル エミュレータには他にも多くの機能がラップされていますが、信頼できるステータス ラインを提供するためだけに、大量のターミナル エミュレーション コードが必要になります。


ただし、軽量のソリューションが存在する限り、

  1. あなたのプログラム ( Node.jsインスタンス) は、それらが実行されているペインとの端末の対話が制限されています (つまり、カーソルの位置がありません)。
  2. プログラムの実行中にペインのサイズを変更しないでください。

多くの端末エミュレーターと同様に、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の外部でも動作するはずです。csrcup

于 2012-03-18T09:00:12.690 に答える
15

私は tmux - ticket のペイン ステータス バーに取り組んでいます。私の開発ブランチは github にあります: https://github.com/jonathanslenders/tmux

現在、これにより、機能する名前変更ペインの「タイトル」コマンドが既に追加されています。まだいくつかのバグがあり、API は改善されます。アイデアは、ペインごとにステータス バーを作成することです。これには、セッション ステータス バーのように、何らかの書式を設定できます。tmux の残りの部分と同様に、すべてがスクリプト可能になり、カスタマイズ可能になります。完成して安定したら、おそらく公式の tmux に含まれるでしょう。

于 2013-04-12T10:01:35.007 に答える
7

はい、そのようなコマンドがあります: tmux. セッションに名前を付けると、内側のステータス バーに表示されます。

TMUX=0 tmux new-session -s my-new-session
于 2012-03-17T16:41:41.987 に答える
4

これは短期的には役に立ちませんが、tmux にはペインごとのタイトルの機能要求があります: http://sourceforge.net/tracker/?func=detail&aid=3495916&group_id=200378&atid=973265#

その間、他の人が述べたように、入れ子の tmux は適切に機能します。

于 2012-10-19T21:05:40.883 に答える
3

TL;DR

次の構成を tmux 構成ファイルに追加します (私の場合は~/.tmux.conf.local)

# dispaly pane_current_path as the pane title
set -g pane-border-status top
set -g pane-border-format "#{pane_index} #{pane_current_path}"

次に実行します:

tmux source-file ~/.tmux.con

楽しめ

https://stackoverflow.com/a/37602055/5121972に感謝

于 2020-07-27T07:53:03.753 に答える