Zabij sesję tmux i wybierz inną sesję tmux

11

Próbuję powiązać, Xaby wykonać następujące czynności:

  • pytaj użytkownika, czy sesja powinna zostać zabita
  • jeśli ywprowadzono, zabij sesję
  • po zabiciu sesji wybierz inną sesję (ostatnią, poprzednią lub następną)

Niektóre podobne polecenia, które nie są całkiem poprawne

  1. Zabij sesję i zamknij terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Pytaj użytkownika o nazwę sesji do zabicia i wybierz następną sesję po zabiciu:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Nie udało mi się znaleźć przykładów podobnych poleceń. Oto rozwiązanie, które nie działa:

    bind X confirm-before -p "Kill #S (y/n)?" "SESSION='#S' \; \
    switch-client -n \; kill-session -t \"$SESSION\""
    
Trey Hunner
źródło

Odpowiedzi:

12

Myślę, że jest to blisko tego, czego chcesz:

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

Twoje podejście nr 3 jest prawidłowe, ale problem polega na tym, confirm-beforeże nie wykonuje status-leftstylów zastępczych (np. #S) W ciągu poleceń.

Zastrzeżeniem dla powyższego powiązania jest to, że ponieważ wszystko jest wykonywane od run-shell, polecenia są uruchamiane poza kontekstem konkretnego klienta lub sesji. To naprawdę działa tylko dlatego, że klient „domyślny” (dla switch-client) i sesja „domyślny” (dla #S) są ostatnio aktywnymi. Działa to tak, jak byś się spodziewał, o ile masz tylko jednego aktywnego klienta (np. Jednego użytkownika, który nie wpisuje innego klienta tmux, dopóki polecenia powłoki nie zakończą się ); może dramatycznie zawieść, jeśli (np.) uruchomisz wiązanie w kliencie A klienta Tmux , ale klient Tmux B otrzyma nowe dane wejściowe, zanim uruchomiona powłoka zdążyrun-shell uruchomić swoje polecenia.

Ten szczególny warunek wyścigu wydaje się być dobrą motywacją do przekazywania komendom informacji o kliencie / sesji / oknie / okienku run-shell. Jest wpis DO ZROBIENIA na temat uzyskiwania if-shelli run-shellwsparcia (opcjonalnie?) status_replace()(Tj. status-leftZamiany w stylu), chociaż może byłby to lepszy wybór format_expand(), który jest rodzajem nowszego super-zestawu status_replace(ofert #{client_tty}itp.).

Chris Johnsen
źródło
To wydaje się robić dokładnie to, czego szukałem. Próbowałem podobnej metody po znalezieniu tmux display-message -p "#S"sztuczki w innej odpowiedzi. Wygląda na to, że kluczem było zawijanie wszystkiego w run-shell. Dzięki!
Trey Hunner,
Jak to zrobić bez confirm-before? Mam problem z poprawieniem ucieczki.
Miles
2
@Miles: Spróbuj tego: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ run-shellrozwija się #Sbezpośrednio, więc możemy pominąć display-messagei dodatkowe cytowanie)
Chris Johnsen
1

Na wypadek, gdyby ktoś natknął się na to pytanie - tmux-sessionist zapewnia tę funkcjonalność wraz z wieloma innymi.

anni
źródło
0

Jest inne pytanie, które zadaje podobne pytanie, ale jest nieco inne.

Jeśli chcesz standardowego choose-sessionzachowania z dodatkową funkcją, która zabija oryginalną sesję, jeśli nie są do niej przywiązani inni klienci, to pytanie może być również interesujące.

rozgwiazdy
źródło
0

Rozszerzając odpowiedź Chrisa Johnsena (w komentarzach) powyżej, jak to zrobić bez pytania lub confirm-before:

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

Jeśli pozostała tylko 1 sesja (sesja, w której aktualnie się znajdujesz) i uruchomisz polecenie, pojawi się komunikat „błąd”, a sesja nie zostanie zabita. Zwykle (jeśli jesteś podobny do mnie) chcesz, aby polecenie przerywało sesję, nawet jeśli nie ma innej sesji, na którą można by przełączyć. Oto co wymyślę:

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\"'"
M. Imam Pratama
źródło