Bir tmux oturumunu öldürün ve başka bir tmux oturumu seçin


11

XAşağıdakileri yapmak için bağlamaya çalışıyorum :

  • oturumun öldürülmesi gerekip gerekmediğini kullanıcıya sor
  • eğer ygirilir, oturumu öldürmek
  • Oturum öldürüldükten sonra başka bir oturum seçin (son, önceki veya sonraki oturum)

Doğru olmayan bazı benzer komutlar

  1. Oturumu öldürün ve terminali kapatın:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Kullanıcıdan öldürülecek oturumun adını sor ve öldürdükten sonra sonraki oturumu seç:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Benzer komutlara örnek bulamadım. İşte işe yaramayan bir şey:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    

Yanıtlar:


12

Bence bu istediğiniz şeye yakın:

bind-key X confirm-before -p "Kill #S (y/n)?" "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'"

# 3 yaklaşımınız doğru çizgilerdedir, ancak sorun şu ki , komut dizesinde -style ikameleri (örneğin ) confirm-beforeyapmaz .status-left#S

Yukarıdaki bağlama için bir uyarı, her şey yapıldığından run-shell, komutların herhangi bir belirli istemci veya oturumun bağlamı dışında çalıştırılmasıdır. Gerçekten çalışır çünkü “varsayılan” istemci (for switch-client) ve “default” oturumu (for #S) en son aktif olanlardır. Bu, yalnızca tek bir etkin istemciniz (örneğin , kabuk komutları çalışmayı bitirene kadar başka bir tmux istemcisine yazmayan tek bir kullanıcı) beklediğiniz sürece çalışır; (örn.) tmux istemcisi A'da bağlamayı tetiklerseniz önemli ölçüde başarısız olabilir , ancak kabuk başladığı komutları çalıştırma şansına sahip olmadan önce tmux istemcisi B tarafından yeni girdi alınır run-shell.

Bu özel yarış koşulu, run-shellkomutlara istemci / oturum / pencere / bölme bilgisi sağlamak için hoş bir motivasyon gibi görünüyor . Alma if-shellve run-shelldestekleme konusunda bir TODO girişi var (isteğe bağlı?) status_replace()(Yani, status-lefttarzı ikameler), ancak belki de daha format_expand()yeni bir süper set status_replace(teklifler #{client_tty}, vb.)


Bu tam olarak aradığım şeyi yapıyor gibi görünüyor. tmux display-message -p "#S"Başka bir cevapta hile bulduktan sonra benzer bir yöntem denemiştim . Her şeyi run-shell'e sarmak anahtar gibi görünüyordu. Teşekkürler!
Trey Hunner

Bunu nasıl yapıyorsun confirm-before? Kaçmayı doğru yapmakta zorlanıyorum.
Miles

2
@Miles: Bunu deneyin: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ doğrudan run-shellgenişler #S, bu yüzden display-messageve ekstra alıntıyı atlayacağız )
Chris Johnsen


0

Orada başka bir soru benzer bir soru sorar ama biraz farklıdır.

Başka choose-sessionhiçbir istemci bağlı kalmazsa, orijinal oturumu öldüren ek özellik ile standart davranış istiyorsanız, o zaman bu soru da ilgi çekici olabilir.


0

Dan Genişleyen Chris Johnsen istemi veya olmadan nasıl yapılacağına ilişkin, yukarıda (yorumlarda) cevap confirm-before:

bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'

Yalnızca 1 oturum kaldı (şu anda bulunduğunuz oturum) ve komutu çalıştırırsanız, bir "hata" iletisi alırsınız ve oturum öldürülmez. Normalde (benim gibiyseniz), geçiş yapabileceği başka bir oturum olmamasına rağmen komutun oturumu öldürmeye devam etmesini istersiniz. İşte ben geldim:

bind-key X if-shell '[ $(tmux list-sessions | wc -l) -ne 1 ]' \
                    "run-shell 'tmux switch-client -n \\\; kill-session -t \"#S\"'" \
                    "run-shell 'tmux kill-session -t \"#S\"'"
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.