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.