Tmux'ta Bölme Başlığı


89

Yerel makinemde aynı anda çalışan 3 node.js örneğim var. Her birinin "sunucular" adı verilen bir tmux penceresinde kendi bölmesi vardır. Sorun şu ki, hangi düğümün hangi bölmede çalıştığını anlamak o kadar kolay değil çünkü günlükleri benzer.

İhtiyacım olan şey, her bölme için bir başlık. Anladığım kadarıyla, tmux'un kendisi bu özelliğe sahip değil: sadece pencereler için başlıklara sahip, bölmeler için değil. Her node.js örneği için her bölmenin içinde ayrı bir tmux oturumu başlatmak, aşırı derecede abartılı gibi görünür.

Öyleyse, bir komutu başlatan, çıktısını belirli bir durum çubuğuyla saran küçük bir program var mı?

Şimdiden teşekkürler


1
tmux sürüm 2.3'ten itibaren bölme başlıklarını destekler, bkz. stackoverflow.com/a/37602055/266453
Dennis G

Yanıtlar:


80

tmux , bölme başına başlıkları destekler, ancak bu başlıkları görüntülemek için bölme başına bir konum sağlamaz.

Bir bölmenin başlığını ESC ]2;… ESC kaçış dizisi ile ayarlayabilirsiniz \(örneğin , tmux kılavuz sayfasındaki İsimler ve Başlıklar adlı bölüme bakın ). Bunu şu şekilde kabuktan yapabilirsiniz:

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

Her bölmenin başlığı varsayılan olarak sistemin ana bilgisayar adıdır. Varsayılan olarak Aktif panelin başlığı sağ tarafında görüntülenen tmux durum satırında (oturum değişkeninin varsayılan küresel değer status-rightolduğunu "#22T" %H:%M %d-%b-%y, hangi gösterileri bölmenin başlığı, zaman ve tarih 22 karakter).

Bu nedenle, aktif bölmenin başlığını görmekten memnun kaldığınız sürece (yani, etkin olmayan bölmenin başlığını görmek için bölmeleri değiştirmeye istekli olduğunuz), varsayılan işlevsellik ile geçebilirsiniz. Her bölme için ana komutu başlatmadan önce uygun başlık ayarı kaçış sırasını göndermeniz yeterlidir.


Bölme başına bazı bilgileri görüntülemek için kesinlikle özel bir satıra ihtiyacınız varsa, iç içe geçmiş tmux oturumları ilk düşündüğünüz kadar çok (gereksiz) "aşırı" olmayabilir.

Genel durumda, belirli bir terminalde ihlal edilmemiş bir durum satırı sağlamak için, orijinal terminal ile yeni bir terminal (biri daha az hatlı) arasında bulunan tam bir terminal (yeniden) emülatörüne ihtiyacınız olacaktır. İç terminale gönderilen kontrol dizilerini çevirmek ve bunları orijinal terminale çevirmek için bu tür (yeniden) öykünme gereklidir. Örneğin, dış terminalin altında bir durum satırı tutmak için komut

Son satıra git.

iç terminale gönderilen

Son satıra gitme.

dış terminale çevrildiğinde ve gönderildiğinde. Aynı şekilde, iç terminale gönderilen bir LF,

İmleç son satırın yanındaysa, sondan son satıra kadar net bir satır sağlamak için bu satırı ve üzerindeki tüm satırları bir satır yukarı kaydırın (son satırdaki durum satırını korur). Aksi takdirde, bir LF gönderin.

dış terminalde.

Tmux ve screen gibi programlar , sadece bu tür terminal yeniden emülatörlerdir. Elbette, terminal öykünücüsünün etrafına sarılmış birçok başka işlev vardır, ancak yalnızca güvenilir bir durum satırı sağlamak için büyük bir uçbirim öykünme koduna ihtiyacınız olacaktır .


Bununla birlikte, olduğu sürece hafif bir çözüm vardır.

  1. programlarınız ( Node.js örnekleri) çalıştıkları bölmelerle sınırlı terminal etkileşimlerine sahiptir (yani imleç konumlandırması yoktur) ve
  2. programlarınız çalışırken bölmeleri yeniden boyutlandırmazsınız.

Birçok uçbirim öykünücüsü gibi tmux , bölmelerinde bir "kaydırma bölgesini ayarla" uçbirim kontrol komutunu destekler. Kaydırma bölgesini terminalin üst (veya alt) N-1 satırlarıyla sınırlamak ve kaydırılmayan satıra bir tür örnek tanımlayıcı metin yazmak için bu komutu kullanabilirsiniz.

Kısıtlamalar (imleç hareket komutlarına izin verilmez, yeniden boyutlandırma yok) gereklidir, çünkü çıktıyı üreten program (örneğin, bir Node.js örneği) kaydırmanın belirli bir bölgeyle sınırlı olduğu konusunda hiçbir fikre sahip değildir. Çıktı üreten program imleci kaydırma bölgesinin dışına hareket ettirdiyse, çıktı bozulabilir. Benzer şekilde, uçbirim öykünücüsü, uçbirim yeniden boyutlandırıldığında büyük olasılıkla kaydırma bölgesini otomatik olarak sıfırlar (bu nedenle, "kaydırılmayan çizgi" muhtemelen kayarak uzaklaşacaktır).

tputUygun kontrol dizilerini oluşturmak, kaydırılmayan satıra yazmak ve imleci kaydırma bölgesine taşıdıktan sonra bir program çalıştırmak için kullanan bir komut dosyası yazdım :

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

Bunu şu şekilde kullanabilirsiniz:

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'

Komut dosyası , terminal kendi ve terminfo yeteneklerini desteklediği ve yayınladığı sürece tmux dışında da çalışmalıdır .csrcup


betiğiniz tam olarak beklediğim gibi çalışıyor; tek soru: "non_scroll_line" ın rengini özelleştirmek için google'da ne yapmalıyım?
Andrey Lushnikov

1
Belki “terminfo özelliği ön plan arka plan rengi” (yani terminfo kılavuz sayfasında renk hakkında bilgi edinin). tput"Satır içeriği" bağımsız değişkenine uygun kontrol dizilerini dahil etmek için kullanabilirsiniz . Çoğu terminalle, ile çizgiyi macenta (5) üzerinde "camgöbeği (6) ve yeşil (3)" yapabilirsiniz no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js. setafön setabplanı ayarlar, arka planı ayarlar op, terminallerin varsayılan renklerine sıfırlar. Renk özellikleri, terminal öykünmenize bağlı olarak 0–7, 0–15, 0–87 veya 0–255 arasında bir sayı alır.
Chris Johnsen

Şimdi pymux'u yayınladık. Bu, bölme başlık çubuklarını görüntüler: github.com/jonathanslenders/pymux
Jonathan Slenders

Davranış, bölme başlığının kabukta çalıştırılan komuta ayarlanması gibi görünüyor. Bu nedenle, içinde uzun ömürlü bir işlem (başlık belirleme kaçış dizisinin nasıl çıktılacağını da bilir) çalıştırmadığımız sürece "yapışmaz".
Steven Lu

4
Lütfen aşağıdaki yanıta bir göz atın: stackoverflow.com/a/37602055/266453 tmux sürüm 2.3'ten itibaren bölme kenarlarındaki başlıkları destekler.
Dennis G

78

Bu işlevsellik, bu kaydetmede tmux'a eklenmiştir . 2.2 sürümünde değil, ancak 2.3'te olacak gibi görünüyor.

Etkinleştirmek için:

tmux set -g pane-border-status top

veya tercih ederseniz:

tmux set -g pane-border-status bottom

Bölme kenarlığı durum satırınız olarak özel bir metin ayarlamak için pane-border-format, örneğin aşağıdakilerden yararlanabilirsiniz :

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

1
Bu, bölmenin numarasını ve varsayılan bir başlığı gösterir. Bunu nasıl değiştirirsin?
adn

Bölme numaralarından emin değilim, ancak dizilerden kaçmak için bir xterm pencere başlığı gibi yanıt veriyor. Örneğin, bash ile, "user @ host: working dir /" elde etmek için PS1 = '[\ e] 0; \ u @ \ h: \ w \ a] $'
ayarladım

Anladığım kadarıyla, bu sıralamayı elden önce ayarladın. Ancak onları değiştiren bir kısayol veya tuş kombinasyonu yoktur. Yani, değiştirmek için tmuxdışarıda bir komuta ihtiyacınız tmuxvar. Sağ? Yoksa içinde onu güncelleyebilecek herhangi bir sıra var mı?
ve

Evet, değişkeni çalışan kabukta ayarlıyorsunuz ve bir sonraki komut çizildiğinde güncelleniyor. Bana göre tmux biraz kabataslak görünüyor ve sadece başka bir bölmeye geçtiğinizde onu gerçekten güncelliyor.
kevmitch

Aslında pane-border-format, bölmenin görüntüleneceği özel bir biçim dizesi ayarlamak için kullanabilirsiniz (normal #{...}biçim). Cevabınızı bunu içerecek şekilde düzenledim.
Dennis G

35

tmux 2.6Yapabileceğinizden beri :

$ 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

Aşağıdakileri içeren bir durum çubuğunda bölme başına başlığı görebilirsiniz:

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

Durum çubuğunu şu şekilde devre dışı bırakın:

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

Tmux'un başlığı altınızdan değiştirmesini engellemenin bir yolu olup olmadığını biliyor musunuz? Örneğin, bir bölmenin başlığını ayarlayıp daha sonra bu bölmede bir şey yaparsam, örneğin cd $HOMEbaşlığın değeri olarak değiştirilir $HOME. (Bunu tmux 2.8'de görüyorum.)
pdoherty926

1
@ pdoherty926 Belki cevabı zaten aldınız, ama kontrol edin set-window-option automatic-rename off.
adsız

Ben set-option -g allow-rename offbenim de .tmux.confdosyaya.
Eyal Levin

1
Öneriler için teşekkürler. pane-border-formatNeyin görüntülendiğini kontrol etmek için bir kullanıcı tarafından sağlanan değişken (bu özellik için resmi bir ad olup olmadığından emin değilim) kullanarak yaralandım . İşte bir örnek.
pdoherty926

14

Tmux - ticket için bölme durum çubuğu üzerinde çalışıyorum. Geliştirme şubem burada github'da bulunabilir: https://github.com/jonathanslenders/tmux

Şu anda, bu zaten çalışan bir yeniden adlandırma bölmesi "başlık" komutu ekliyor . Hala bazı hatalar var ve API gelişecek. Buradaki fikir, her bölme için, oturum durum çubuğu gibi bazı biçimlendirmelere sahip olabilen bir durum çubuğu oluşturmaktır. Tmux'un geri kalanı gibi, her şey yazılabilir ve özelleştirilebilir olmalıdır. Bittiğinde ve kararlı olduğunda, muhtemelen resmi tmux'a dahil edilecektir.


Siz oradayken, bölme başlığının bir bölme sırasında varsayılan pencere başlığı olmasını sağlayabilir misiniz?
djsadinoff

Bu şube tmux ile asla birleştirilmedi. Ama bunun yerine bölme başlık çubuklarına sahip pymux'u yarattım
Jonathan Slenders

Bu komut en son derlemede de çalışmaz (a24260'ı taahhüt edin).
adn

14

Tmux 2.3 sürümünü kullanıyorum, bence border style önceki sürümlerde desteklenmiyor. bu benim için çalıştı:

Her bölme için başlığı ayarlayın:

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

Sonra:

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

9
En azından tmux 2.6 kadar yeni, tmux içinde bölme başlığını değiştirebilirsiniz: select-pane -T "my title"bunu yapar. Hatta bir anahtar bağlama bile kurabilirsiniz, böylece başlığı bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
sağlamanız yeterlidir

3
@lucasem belki bu konuyu takip etmedim ama cevap bu gibi görünüyor
icicleking

@lucasem% 100 emin değilim, ancak yönteminizin (tmux'un son sürümleri için bu iş parçacığının tamamında en iyi ve en basit olan) yalnızca pane-border-statusseçenek bir şeye ( topveya bottom) ayarlanmışsa işe yarayacağına inanıyorum .
cjauvin

11

Bir gif bin kelimeye bedeldir. ( kaynak )

tmux-xpanes , yeni eklenen -tseçenek aracılığıyla her bölme için başlığın görüntülenmesini destekleyen tmux tabanlı bir terminal bölücüdür .


1
Bir gif bin kelimeye bedeldir, ancak eğer çürümeye bağlarsa hiçbir değeri yoktur.
Fund Monica'nın Davası

7

Evet böyle bir komut vardır: tmux. Oturumunuza bir ad verin ve bir iç durum çubuğunda görüntülenecektir:

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

2
Evet, cevabınız için teşekkürler! Ama bu yüzden, her bölmede sadece altındaki bir başlık için yeni bir tmux oturumu başlatmak zorunda kalacağım - biraz abartılı, değil mi?
Andrey Lushnikov

Bilmiyorum. Bu mu? Bunu denediniz mi? Ekstra oturum ne kadar ekstra bellek kullanıyor?
event_jr

evet, bugüne kadar iç içe tmux oturumları kullanıyorum. Bellek tüketimi ve bunun gibi şeyler hakkında emin değilim - sadece kavramın kendisinden hoşlanmıyorum çünkü saf değil.
Andrey Lushnikov


0

TL; DR

Tmux yapılandırma dosyanıza aşağıdaki yapılandırmaları ekleyin (benim durumumda ~/.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}"

o zaman koş:

tmux source-file ~/.tmux.con

tadını çıkar

Https://stackoverflow.com/a/37602055/5121972 sayesinde

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.