Bir tmux anahtarını birden çok komuta bağlama


37

Birkaç sunucu parametresini izlemek için çoklu tmux penceresini açıyorum. Ctrl-S ile başka bir monitör komutuyla yeni bir pencere açabilirim.

Şimdi Ctrl-Q cihazını birkaç monitörlü başka bir çoklu pencere açmak için bağlamak istiyorum . Bir anahtarı birden çok komuta nasıl bağlarım? Onları zincirlemeye çalıştım; ve \; - hiç bir şey yardımcı olmaz. Lütfen aşağıda ... yerine ne kullanmam gerektiğini tavsiye edin .

Üst üste binen arka plan komutlarını askıya almak için yeni bir pencere açtığımda mümkün mü?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

Yanıtlar:


37

Todd Freed haklı, bunu yapmanın "doğru" yolu kullanıyor \;. Sırala. Ama bir engel var.

Görüyorsunuz, bir araya tmux komutları vererek tmux komutları dizisine katılıyorsunuz ;. Böylece, tmux kaynaklı bir dosyada

new-session "monitor1" ; split-window -v "monitor2"

Eğer bir nedenden ötürü, hepsini tek bir satırda istiyordun. Şimdi, bu tek satırlık bileşik deyimi verebilir tmuxayrıca bir kabuk komutunu ama; öylesine kaçmış gerektiğini başka argüman olarak kabuk yorumlayıp onu tmux. Bu nedenle, yukarıdakilerden kabuğa eşdeğer olan

$ tmux new-session "monitor1" \; split-window -v "monitor2"

Benzer şekilde, tmux bind-keykomutu , tmux komutu olan bir dizi argüman ve tuşa basıldığında çalıştırılacak argümanları alır. C-qYukarıdaki sıraya tmux kaynaklı bir dosyanın içinden bağlanmak istiyorsanız,

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Burada ; tmux'dan kaçtık , böylece tmux bind-keykomutun sonu olarak yorumlanmıyor , fakat anahtarın bind-keybağlı değeri olarak bir bileşik komut oluşturmasını söylemek için başka bir argüman olarak C-q.

Peki, bunu tmux'a kabuktan yapmak istediğimizde ne olur? Bir sürü kaçış.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

İlk olarak, kaçmak zorunda \ ve; her birinden kabuk kabuk iki karakter geçmesine neden \;bir argüman olarak tmux. Bu daha sonra ;tmux'dan kaçar ve bileşik ifadenin tamamını bağlayıcı olarak atamasına neden olur C-q.


Şimdi, tüm bunlar, tekrar tekrar böyle bir karmaşık tmux kurulumu kullanıyorsanız, içeride tutmak için bir tmux dosyası oluşturmanızı öneririm:

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Ve sonra:

$ tmux source split-windows.tmux  # (or even make an alias for this)

Bu şekilde sürdürmek çok daha kolay olacak.


3
Komut satırından birden çok komuta bağlanma tuşlarını aramak için daha az korkunç hale getirmek için, aynı zamanda şu karakterlerden kaçabilirsiniz \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
— Tim Heap

12

Yani gerçek cevap: komutları ters eğik çizgi ile takip ederek noktalı virgül.

bind-key C send-keys foo \; send-keys bar

Bunu tmux.conf dosyasına koyarsınız ya da tmux ":" komutundan çalıştırırsınız.


bu, harikaydı ve iç içe tmux oturumu kullanmak ve iç içe tmux pencerelerinde gezinmek için çalışıyordu.
— Paul

1
Bu mu değil kabuk komut satırından çalışır. Yani, tmux bind-key C send-key foo \; send-tuşlar bar C 'den 'foo" bağlayıcı etkisine sahiptir',' ama baskılar 'çubuk' derhal.
— Lqueryvg

Evet, bunu tmux içinden yürütürsün. Netleştirmek için güncellendi.
— Todd,

Güzel! Bu tamamen işe yarıyor ... muchas gracias!
— Brad Parks

Çay yok ; tek tırnak içinde kaçmak gerekmez
— elig

2

Bunu küçük bir geçici çözümle yapabilirsiniz. Çalıştırılacak bir komut dosyası öneren cevaba benzer (bu durum davanızı iyi idare eder), genellikle "run-shell" kullanılarak ve tmux'un kendisini shell komutu olarak çağırmak suretiyle yapılabilir.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

'xyz' tuşlarını, tmux 'clear-history' komutunu gönderecek ve daha sonra 'clear' shell yerleşikini çağıracak.

Bütün dizge sadece çoklu kabuk komut dizisidir.


1

.tmux.confDosyanızın anahtar bağlantılarına böyle bir şey ekleyebilirsiniz :

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Ve tmux-new-session.shsenin içinde olabilir:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

Burada gösterilen her şey işe yaramaz çünkü bu

bind q send-keys "command1" \; send-keys "command2"

komut2'yi derhal çalıştıracak ve q sadece "komut1" gönderme anahtarlarına bağlanacaktır.

İşte çözüm:

bind R source-file "$HOME/.tmux/reload.tmux"

~ / .Tmux / reload.tmux dosyasına aşağıdaki gibi çoklu komutlar koyun:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
Bekle, Peeja'nın söylediğini kullan (\\\;) :-)
— saat
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.