web-dev-qa-db-ja.com

Tmuxのペインタイトル

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

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

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

前もって感謝します

73

tmuxはペインごとのタイトルをサポートしますが、これらのタイトルを表示するためのペインごとの場所を提供しません。

エスケープシーケンスESC ]2;…ESC \でペインのタイトルを設定できます(たとえば、tmuxマンページのNames and Titlesというセクションを参照してください) )。次のようにシェルからこれを行うことができます。

printf '\033]2;%s\033\\' 'title goes here'

各ペインのタイトルはデフォルトでシステムのホスト名になります。デフォルトでは、アクティブなペインのタイトルはtmuxステータス行の右側に表示されます(セッション変数status-rightのデフォルトのグローバル値は"#22T" %H:%M %d-%b-%yです。ペインのタイトル、時刻、日付)。

したがって、アクティブなペインのタイトルを表示できることに満足している限り(つまり、非アクティブなペインのタイトルを表示するためにペインを切り替える意思がある場合)、デフォルトの機能を使用できます。各ペインのメインコマンドを開始する前に、適切なタイトル設定エスケープシーケンスを送信するだけです。


ペインごとの情報を表示するために専用の行が絶対に必要な場合、ネストされたtmuxセッションは、最初に考えたほどの(不要な)「過剰」ではない場合があります。

一般的な場合、特定の端末に違反ステータス行を提供するには、元の端末と新しい端末(1行少ない行)の間にある完全な端末(再)エミュレーターが必要です。このような(再)エミュレーションは、内部端末に送信された制御シーケンスを変換し、元の端末に変換するために必要です。たとえば、外部端末の下部にステータス行を維持するには、コマンド

最後の行に移動します。

内部端末に送信される必要があります

次の最後の行に移動します。

翻訳されて外部端末に送信されたとき。同様に、内部端末に送信されるLFは

カーソルが最後の行の隣にある場合は、この行とその上のすべての行を1行上にスクロールして、最後から2番目の行を明確にします(最後の行のステータス行を保護します)。それ以外の場合は、LFを送信します。

外側のターミナルで。

tmuxscreenのようなプログラムは、まさにそのような端末リエミュレータです。もちろん、ターミナルエミュレータには他にも多くの機能がありますが、reliableステータス行を提供するためだけに、大量のターミナルエミュレーションコードが必要になります。


ただし、次の場合に限り、軽量のソリューションがあります。

  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'

端末がcsrおよびcup terminfo機能をサポートおよび公開している限り、スクリプトはtmuxの外でも動作するはずです。

75
Chris Johnsen

この機能は this commit でtmux gitに追加されました。バージョン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}"
60
kevmitch

Tmux-チケットのペインステータスバーで作業しています。私の開発ブランチは、githubのここにあります: https://github.com/jonathanslenders/tmux

現時点では、これは既に動作中のrename-pane "title"コマンドを追加しています。まだいくつかのバグがあり、APIは改善されます。アイデアは、ペインごとにステータスバーを作成することで、セッションステータスバーのように、書式を設定できます。 tmuxの他の部分と同様に、すべてがスクリプト可能になり、カスタマイズ可能になります。終了して安定したら、おそらく公式のtmuxに含まれるでしょう。

14

Tmuxバージョン2.3を使用していますが、以前のバージョンでは境界線スタイルはサポートされていないと思います。これは私のために働いたものです:

各ペインでタイトルを設定します。

printf '\033]2;My Pane Title\033\\'

次に:

tmux set -g pane-border-format "#{pane_index} #T"
12
OriG

Gifは千の言葉に値します。 ( ソース

tmux-xpanes はtmuxベースの端末区切り線であり、新しく追加された-tオプション。

9
navigaid

tmux 2.6 できるよ:

$ tmux select-pane -t {pane} -T {title}

# Examples:
$ tmux select-pane -T title1          # Change title of current pane
$ tmux select-pane -t 1 -T title2     # Change title of pane 1 in current window
$ tmux select-pane -t 2.1 -T title3   # Change title of pane 1 in window 2

ステータスバーのペインごとにタイトルを表示するには、次を使用します。

$ tmux set pane-border-status bottom      # For current window
$ tmux set -g pane-border-status bottom   # For all windows

ステータスバーを無効にします。

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows
9
Eyal Levin

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

TMUX=0 tmux new-session -s my-new-session
6
event_jr

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

それまでの間、他の人が述べたように、tmuxのネストはうまく機能します。

4
Newtonx