Judul Panel di Tmux

89

Di mesin lokal saya, saya memiliki 3 instance node.js yang berjalan secara bersamaan. Masing-masing memiliki panelnya sendiri di jendela tmux yang disebut "server". Masalahnya adalah tidak mudah untuk mengetahui node mana yang berjalan di panel mana, karena log mereka serupa.

Yang saya butuhkan adalah judul untuk setiap panel. Seperti yang saya dapatkan, tmux sendiri tidak memiliki fitur tersebut: ia hanya memiliki judul untuk windows dan bukan untuk panel. Meluncurkan sesi tmux terpisah di dalam setiap panel untuk setiap instance node.js tampak seperti berlebihan.

Jadi, apakah ada program kecil yang menjalankan perintah, membungkus keluarannya dengan bilah status tertentu?

Terima kasih sebelumnya

Andrey Lushnikov
sumber
1
tmux pada versi 2.3 mendukung judul panel, lihat stackoverflow.com/a/37602055/266453
Dennis G

Jawaban:

80

tmux mendukung judul per panel, tetapi tidak menyediakan lokasi per panel untuk menampilkan judul ini.

Anda dapat menyetel judul panel dengan escape sequence ESC ]2;… ESC \(misalnya lihat bagian bernama Names and Titles di halaman manual tmux ). Anda bisa melakukan ini dari cangkang seperti ini:

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

Judul setiap panel secara default menggunakan nama host sistem. Secara default, judul panel aktif ditampilkan di sisi kanan baris status tmux (nilai global default dari variabel sesi status-rightadalah "#22T" %H:%M %d-%b-%y, yang menunjukkan 22 karakter dari judul panel, waktu, dan tanggal).

Jadi, selama Anda puas dengan kemampuan untuk melihat judul panel aktif (yaitu ingin beralih panel untuk melihat judul panel yang tidak aktif), Anda dapat bertahan dengan fungsionalitas default. Kirimkan saja urutan escape pengaturan judul yang sesuai sebelum memulai perintah utama untuk setiap panel.


Jika Anda benar-benar membutuhkan baris khusus untuk menampilkan beberapa informasi per panel, maka sesi tmux bersarang mungkin tidak terlalu “berlebihan” (tidak perlu) seperti yang mungkin Anda pikirkan sebelumnya.

Dalam kasus umum, untuk menyediakan baris status yang tidak diganggu pada beberapa terminal tertentu, Anda memerlukan emulator (ulang) terminal penuh yang berada di antara terminal asli dan terminal baru (satu dengan satu baris lebih sedikit). Emulasi (ulang) seperti itu diperlukan untuk menerjemahkan urutan kontrol yang dikirim ke terminal dalam dan menerjemahkannya ke terminal asli. Misalnya, untuk mempertahankan baris status di bagian bawah terminal luar, perintahnya

Pindah ke baris terakhir.

dikirim ke terminal dalam harus menjadi

Pindah ke baris terakhir berikutnya.

saat diterjemahkan dan dikirim ke terminal luar. Demikian juga, LF yang dikirim ke terminal dalam harus menjadi

Jika kursor berada di baris berikutnya, gulir baris ini dan semua baris di atasnya ke atas satu baris, untuk memberikan baris berikutnya yang jelas (melindungi baris status di baris terakhir). Jika tidak, kirim LF.

di terminal luar.

Program seperti tmux dan layar hanyalah emulator terminal seperti itu. Tentu, ada banyak fungsi lain yang melingkupi emulator terminal, tetapi Anda akan membutuhkan banyak kode emulasi terminal hanya untuk menyediakan baris status yang dapat diandalkan .


Namun, ada solusi ringan selama

  1. program Anda ( instans Node.js ) memiliki interaksi terminal yang terbatas dengan panel tempat program Anda berjalan (yaitu tidak ada posisi kursor), dan
  2. Anda tidak mengubah ukuran panel saat program Anda berjalan.

Seperti banyak emulator terminal, tmux mendukung perintah kontrol terminal "set scrolling region" di panelnya. Anda dapat menggunakan perintah ini untuk membatasi wilayah gulir ke baris N-1 atas (atau bawah) terminal dan menulis semacam teks pengenal contoh ke dalam baris non-gulir.

Pembatasan (tidak ada perintah gerakan kursor yang diperbolehkan, tidak ada pengubahan ukuran) diperlukan karena program yang menghasilkan output (misalnya instance Node.js ) tidak tahu bahwa pengguliran telah dibatasi ke wilayah tertentu. Jika program penghasil keluaran kebetulan memindahkan kursor ke luar wilayah pengguliran, maka keluaran mungkin menjadi kacau. Demikian pula, emulator terminal mungkin secara otomatis menyetel ulang wilayah pengguliran saat terminal diubah ukurannya (jadi "garis non-pengguliran" mungkin akan berakhir dengan pengguliran).

Saya menulis skrip yang digunakan tputuntuk menghasilkan urutan kontrol yang sesuai, menulis ke baris non-gulir, dan menjalankan program setelah memindahkan kursor ke wilayah gulir:

#!/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"

Anda mungkin menggunakannya seperti ini:

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'

Script juga harus luar pekerjaan tmux selama mendukung terminal dan menerbitkan nya csrdan cupterminfo kemampuan.

Chris Johnsen
sumber
skrip Anda bekerja persis seperti yang saya harapkan; satu-satunya pertanyaan: apa yang harus saya google untuk menyesuaikan warna "non_scroll_line"?
Andrey Lushnikov
1
Mungkin “terminfo ability foreground background color” (yaitu membaca tentang warna di halaman manual terminfo). Anda dapat menggunakan tputuntuk menyertakan urutan kontrol yang sesuai dalam argumen "konten baris". Dengan sebagian besar terminal, Anda dapat membuat jalur menjadi "cyan (6) dan hijau (3) di magenta (5)" dengan no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js. setafset latar depan, setabset latar belakang, opsetel ulang ke warna default terminal. Kemampuan warna mengambil angka dari 0–7, 0–15, 0–87, atau 0–255, bergantung pada emulasi terminal Anda.
Chris Johnsen
Kami sekarang merilis pymux. Ini menampilkan bilah judul panel: github.com/jonathanslenders/pymux
Jonathan Slenders
Tampaknya perilakunya adalah bahwa judul panel disetel ke perintah yang dijalankan di shell. Jadi itu tidak akan "menempel" kecuali kita menjalankan satu proses berumur panjang (yang juga tahu bagaimana mengeluarkan urutan pelolosan pengaturan judul) di dalam.
Steven Lu
4
Silakan lihat jawaban lebih jauh di bawah ini: stackoverflow.com/a/37602055/266453 tmux sejak versi 2.3 mendukung judul dalam batas panel.
Dennis G
78

Fungsionalitas ini telah ditambahkan ke tmux dalam komit ini . Ini tidak dalam versi 2.2, tapi sepertinya akan di versi 2.3.

Untuk mengaktifkannya:

tmux set -g pane-border-status top

atau jika Anda lebih suka:

tmux set -g pane-border-status bottom

Untuk mengatur teks kustom sebagai baris status perbatasan panel, Anda dapat menggunakan pane-border-format, misalnya seperti:

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"
kevmitch
sumber
1
Ini memperlihatkan jumlah panel dan judul default. Bagaimana Anda mengubah pikirannya?
dan
Saya tidak yakin tentang nomor panelnya, tetapi merespons seperti judul jendela xterm untuk keluar dari urutan. Misalnya, dengan bash, saya telah menyetel PS1 = '[\ e] 0; \ u @ \ h: \ w \ a] $' untuk mendapatkan "user @ host: working dir /"
kevmitch
Sejauh yang saya mengerti, Anda mengatur urutan itu sebelumnya. Namun tidak ada shortcut atau kombinasi tombol yang mengubahnya. Jadi, tmuxAnda memerlukan beberapa perintah di luar tmuxuntuk mengubahnya. Baik? Atau apakah ada urutan di dalamnya yang dapat memperbaruinya?
dan
Ya, Anda baru saja mengatur variabel di shell yang sedang berjalan dan itu diperbarui ketika prompt berikutnya ditarik. Bagi saya, tampaknya tmux agak samar dan hanya benar-benar memperbaruinya ketika Anda beralih ke panel lain.
kevmitch
Anda sebenarnya dapat menggunakan pane-border-formatuntuk menyetel string format kustom untuk panel yang akan ditampilkan ( #{...}format biasa ). Saya telah mengedit jawaban Anda untuk memasukkan ini.
Dennis G
35

Karena tmux 2.6Anda bisa melakukan:

$ 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

Anda dapat melihat judul per panel di bilah status dengan:

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

Nonaktifkan bilah status dengan:

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows
Eyal Levin
sumber
Apakah Anda tahu jika ada cara untuk mencegah tmux mengubah judul dari bawah Anda? Misalnya, jika saya menyetel judul panel dan kemudian melakukan sesuatu di panel itu, seperti cd $HOME, judul diubah menjadi nilai $HOME. (Saya melihat ini di tmux 2.8.)
pdoherty926
1
@ pdoherty926 Mungkin Anda sudah mendapatkan jawabannya, tapi periksa set-window-option automatic-rename off.
noname
Saya ada set-option -g allow-rename offdi .tmux.conffile saya .
Eyal Levin
1
Terima kasih atas sarannya. Saya akhirnya menggunakan pane-border-formatdan variabel yang disediakan pengguna (saya tidak yakin apakah ada nama resmi untuk fitur ini) untuk mengontrol apa yang ditampilkan. Berikut contohnya.
pdoherty926
14

Saya sedang mengerjakan panel status bar untuk tmux - tiket. Cabang pengembangan saya dapat ditemukan di sini di github: https://github.com/jonathanslenders/tmux

Sekarang, ini sudah menambahkan perintah "judul" rename-pane yang berfungsi . Masih ada beberapa bug, dan API akan meningkat. Idenya adalah membuat bilah status per panel, yang dapat memiliki beberapa pemformatan, seperti bilah status sesi. Seperti tmux lainnya, semuanya harus dapat ditulis dan disesuaikan. Setelah selesai dan stabil, ini mungkin akan dimasukkan ke dalam tmux resmi.

Jonathan Slenders
sumber
Saat Anda berada di sana, dapatkah Anda membuatnya sehingga judul panel menjadi judul jendela default selama break-pane?
djsadinoff
Cabang ini tidak pernah digabungkan di tmux. Tapi saya malah membuat pymux, yang memiliki bilah judul panel: github.com/jonathanslenders/pymux
Jonathan Slenders
Perintah ini juga tidak berfungsi pada build terbaru (komit a24260).
dan
14

Saya menggunakan tmux versi 2.3, saya pikir gaya border tidak didukung di versi sebelumnya. inilah yang berhasil untuk saya:

Untuk setiap panel atur judul:

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

Kemudian:

tmux set -g pane-border-format "#{pane_index} #T"
OriG
sumber
9
Setidaknya pada tmux 2.6, Anda dapat mengubah judul panel dalam tmux: select-pane -T "my title"lakukan ini. Anda bahkan dapat mengatur pengikatan kunci sehingga Anda hanya perlu memberikan judulnya:bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem
3
@lucasem mungkin saya belum mengikuti utas ini, tetapi ini sepertinya jawabannya.
icicleking
@lucasem Saya tidak 100% yakin tetapi saya percaya metode Anda (IMO mana yang terbaik dan paling sederhana di seluruh utas ini, untuk versi terbaru tmux) hanya berfungsi jika pane-border-statusopsi disetel ke sesuatu ( topatau bottom).
cjauvin
11

GIF memiliki arti ribuan kata. ( sumber )

tmux-xpanes adalah pembagi terminal berbasis tmux, yang mendukung tampilan judul untuk setiap panel melalui opsi yang baru ditambahkan -t.

navigaid.dll
sumber
1
Sebuah gif bernilai ribuan kata, tetapi jika ada tautan yang membusuk, itu tidak ada artinya.
Gugatan Dana Monica
7

Ya ada perintah seperti: tmux. Beri nama sesi Anda dan itu akan ditampilkan di bilah status bagian dalam:

TMUX=0 tmux new-session -s my-new-session
event_jr
sumber
2
Ya, terima kasih atas jawaban Anda! Tetapi dengan demikian saya harus meluncurkan sesi tmux baru di setiap panel hanya untuk satu judul di bagian bawahnya - agak berlebihan, bukan?
Andrey Lushnikov
Saya tidak tahu. Apakah itu? Apakah kamu sudah mencobanya Berapa banyak memori ekstra yang digunakan sesi ekstra?
event_jr
ya, saya telah menggunakan sesi tmux bersarang sampai hari ini. Saya tidak yakin tentang konsumsi memori dan hal-hal seperti ini - saya hanya tidak menyukai konsep itu sendiri karena tidak murni.
Andrey Lushnikov
0

TL; DR

Tambahkan konfigurasi berikut ke file konfigurasi tmux Anda (dalam kasus saya adalah ~/.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}"

lalu lari:

tmux source-file ~/.tmux.con

bersenang senang lah

Terima kasih untuk https://stackoverflow.com/a/37602055/5121972

sstruct
sumber