Uccidi una sessione di tmux e seleziona un'altra sessione di tmux


11

Sto cercando di legare Xper fare quanto segue:

  • chiedere all'utente se la sessione deve essere uccisa
  • se yviene inserito, uccidi la sessione
  • dopo che la sessione è stata interrotta, selezionare un'altra sessione (ultima, precedente o successiva)

Alcuni comandi simili che non sono del tutto giusti

  1. Uccidi la sessione e chiudi il terminale:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Richiedi all'utente il nome della sessione da eliminare e seleziona la sessione successiva dopo l'uccisione:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. Non sono stato in grado di trovare esempi di comandi simili. Ecco una soluzione che non funziona:

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

Risposte:


12

Penso che questo sia vicino a quello che vuoi:

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

Il tuo approccio n. 3 è sulla retta via, ma il problema è che confirm-beforenon si status-leftsostituiscono in stile (ad es. #S) Nella sua stringa di comando.

Un avvertimento per l'associazione di cui sopra è che dal momento che tutto viene eseguito da run-shell, i comandi vengono eseguiti al di fuori del contesto di un particolare client o sessione. Funziona davvero solo perché il client "predefinito" (per switch-client) e la sessione "predefinita" (per #S) sono quelli attivi più recenti. Questo funziona come ci si aspetterebbe finché si ha un solo client attivo (ad es. Un singolo utente che non digita in un altro client tmux fino a quando i comandi della shell non sono stati eseguiti); potrebbe fallire drammaticamente se (ad esempio) si attiva l'associazione nel client tmux A, ma un nuovo input viene ricevuto dal client tmux B prima che la shell avviata run-shellabbia avuto la possibilità di eseguire i suoi comandi.

Questa particolare condizione di gara sembra una buona motivazione per fornire ai run-shellcomandi informazioni client / sessione / finestra / riquadro . C'è una voce TODO su come ottenere if-shelle run-shellsupportare (opzionale?) status_replace()( status-leftEs. Sostituzioni di tipo), anche se forse sarebbe una scelta migliore format_expand(), che è una sorta di un nuovo super-set di status_replace(offerte #{client_tty}, ecc.).


Questo sembra fare esattamente quello che stavo cercando. Avevo provato un metodo simile dopo aver trovato il tmux display-message -p "#S"trucco in un'altra risposta. Sembra che la chiave fosse avvolgere tutto in run-shell. Grazie!
Trey Hunner,

Come si fa a farlo senza confirm-before? Ho problemi a trovare la fuga giusta.
Miglia,

2
@Miles: prova questo: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ si run-shellespande #Sdirettamente, quindi possiamo omettere la display-messagee la sua citazione aggiuntiva)
Chris Johnsen,


0

C'è un'altra domanda che pone una domanda simile ma è leggermente diversa.

Se si desidera il choose-sessioncomportamento standard con la funzione aggiuntiva che uccide la sessione originale se nessun altro cliente rimane attaccato ad essa, anche quella domanda potrebbe essere interessante.


0

Espandendo dalla risposta di Chris Johnsen (nei commenti) sopra, su come farlo senza prompt o confirm-before:

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

Se è rimasta solo 1 sessione (la sessione in cui ti trovi attualmente) ed esegui il comando, riceverai un messaggio di "errore" e la sessione non verrà uccisa. Normalmente (se sei come me) vuoi che il comando continui a uccidere la sessione anche se non c'è altra sessione a cui può passare. Quindi, ecco cosa mi viene in mente:

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\"'"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.