Tmuxのペインタイトル


89

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

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

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

前もって感謝します


1
バージョン2.3以降のtmuxはペインタイトルをサポートしています。stackoverflow.com/ a / 37602055/266453を参照してください
Dennis G

回答:


80

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

外側の端子に。

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


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

  1. プログラム(Node.jsインスタンス)は、プログラムが実行されているペインとの端末の相互作用が制限されており(つまり、カーソルの位置がありません)、
  2. プログラムの実行中は、ペインのサイズを変更しません。

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


スクリプトは私が期待したとおりに機能します。唯一の質問:「non_scroll_line」の色をカスタマイズするには、何をグーグルで検索すればよいですか?
Andrey Lushnikov 2012年

1
たぶん「terminfo機能の前景の背景色」(つまり、terminfoのマンページで色について読んでください)。を使用tputして、「行の内容」引数に適切な制御シーケンスを含めることができます。ほとんどの端末では、線を「マゼンタ(5)のシアン(6)とグリーン(3)」にすることができますno_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.jssetaf前景をsetab設定し、背景をop設定し、端末のデフォルトの色にリセットします。カラー機能は、端末エミュレーションに応じて、0〜7、0〜15、0〜87、または0〜255の数値を取ります。
クリスジョンセン2012年

pymuxをリリースしました。これにより、ペインのタイトルバーが表示されます:github.com/jonathanslenders/pymux
Jonathan

動作は、ペインのタイトルがシェルで実行されているコマンドに設定されているようです。したがって、内部で1つの長期的なプロセス(タイトル設定のエスケープシーケンスを出力する方法も知っている)を実行しない限り、「固執」することはありません。
Steven Lu

4
以下の回答をさらに見てください:stackoverflow.com/a/37602055/266453バージョン2.3以降のtmuxは、ペインの境界線のタイトルをサポートしています。
デニスG

78

この機能は、このコミットで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}"

1
これは、ペインの番号とデフォルトのタイトルを示しています。どのように考えを変えますか?
adn 2016

ペイン番号についてはよくわかりませんが、シーケンスをエスケープするためにxtermウィンドウタイトルのように応答します。たとえば、bashを使用して、PS1 = '[\ e] 0; \ u @ \ h:\ w \ a] $'を設定して、「user @ host:working dir /」を取得しました
kevmitch 2016

私が理解している限り、あなたは事前にそのシーケンスを設定しました。しかし、それらを変更するショートカットやキーの組み合わせはありません。したがって、それを変更するには、tmux外部でいくつかのコマンドが必要tmuxです。正しい?または、それを更新できるシーケンスが内部にありますか?
adn 2016

ええ、実行中のシェルで変数を設定するだけで、次のプロンプトが表示されたときに更新されます。私にとって、tmuxは少し大雑把で、別のペインに切り替えたときにのみ実際に更新されるようです。
kevmitch 2016

実際に使用pane-border-formatして、表示するペインのカスタムフォーマット文字列を設定できます(通常の#{...}フォーマット)。これを含めるように回答を編集しました。
デニスG

35

以来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

tmuxがあなたの下からタイトルを変更するのを防ぐ方法があるかどうか知っていますか?たとえば、ペインのタイトルを設定してから、そのペインでなどの操作を行うcd $HOMEと、タイトルがの値に変更されます$HOME。(これはtmux 2.8で見ています。)
pdoherty9 2620

1
@ pdoherty926たぶんあなたはすでに答えを得ていますが、チェックしてくださいset-window-option automatic-rename off
NONAME

私が持っているset-option -g allow-rename off私の中.tmux.confのファイル。
EyalLevin20年

1
提案をありがとう。私が使用して巻き取られpane-border-format、ユーザーは、表示される内容を制御するために(この機能の正式名称があります場合、私はよく分からない)変数を提供します。ここだ例。
pdoherty9 2620年

14

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

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


そこにいる間に、ブレークペイン中にペインタイトルがデフォルトのウィンドウタイトルになるようにすることはできますか?
djsadinoff 2015

このブランチはtmuxにマージされませんでした。しかし、代わりにpymuxを作成しました。これには、ペインのタイトルバーがあります:github.com/jonathanslenders/pymux
Jonathan

このコマンドは、最新のビルドでも機能しません(commit a24260)。
adn 2016

14

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

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

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

次に:

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

9
少なくともtmux2.6と同じくらい最近では、tmux内でペインのタイトルを変更できます:select-pane -T "my title"これを行います。あなたも、あなただけのタイトルを供給する必要があるので、結合キーを設定することができますbind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem

3
@lucasem多分私はこのスレッドをフォローしていませんが、これは答えのようです。
2018

@lucasem 100%確信はありませんが、あなたの方法(最近のバージョンのtmuxでは、このスレッド全体でIMOが最適で最も単純です)pane-border-statusは、オプションが何か(topまたはbottom)に設定されている場合にのみ機能すると思います。
cjauvin

11

gifは千の言葉の価値があります。(ソース

tmux-xpanesはtmuxベースのターミナルディバイダーで、新しく追加された-tオプションを使用して各ペインのタイトルを表示できます。


1
gifは千の言葉の価値がありますが、リンク切れが発生したとしても、それは価値がありません。
モニカの訴訟に資金を提供する

7

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

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

2
はい、ご回答ありがとうございます!しかし、そのため、すべてのペインで新しいtmuxセッションを起動して、その下部にある1つのタイトルだけを表示する必要があります-ちょっとやり過ぎですね。
Andrey Lushnikov 2012年

知りません。それは...ですか?試しましたか?追加のセッションはどのくらいの追加メモリを使用していますか?
event_jr 2012年

ええ、私は今日までネストされたtmuxセッションを使用しています。私はメモリ消費とこのようなことについてはよくわかりません-私は概念自体が嫌いです 'それは純粋ではないからです。
Andrey Lushnikov 2012年

4

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

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


0

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に感謝します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.