Mata una sesión de tmux y selecciona otra sesión de tmux

11

Estoy tratando de vincularme Xpara hacer lo siguiente:

  • preguntar al usuario si la sesión debe ser eliminada
  • si yse ingresa, elimine la sesión
  • después de que se elimine la sesión, seleccione otra sesión (última, anterior o siguiente)

Algunos comandos similares que no son del todo correctos

  1. Mata la sesión y cierra la terminal:

    bind X confirm-before -p "Kill #S (y/n)?" kill-session
    
  2. Solicite al usuario el nombre de la sesión para matar y seleccione la siguiente sesión después de matar:

    bind X command-prompt -p "kill:"  "switch-client -n \; kill-session -t '%%'"
    
  3. No he podido encontrar ejemplos de comandos similares. Aquí hay una solución que no funciona:

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

Respuestas:

12

Creo que esto está cerca de lo que quieres:

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

Su enfoque # 3 está en la línea correcta, pero el problema es que confirm-beforeno realiza status-leftsustituciones de estilo (por ejemplo #S) en su cadena de comandos.

Una advertencia para el enlace anterior es que, dado que todo se realiza desde run-shell, los comandos se ejecutan fuera del contexto de cualquier cliente o sesión en particular. Realmente solo funciona porque el cliente "predeterminado" (para switch-client) y la sesión "predeterminada" (para #S) son los activos más recientes. Esto funciona como es de esperar siempre y cuando solo tenga un único cliente activo (por ejemplo, un solo usuario que no escriba en otro cliente tmux hasta que los comandos de shell hayan terminado de ejecutarse); podría fallar dramáticamente si (p. ej.) activa el enlace en tmux client A, pero tmux client B recibe una nueva entrada antes de que el shell iniciado run-shellhaya tenido la oportunidad de ejecutar sus comandos.

Esta condición de carrera en particular parece una buena motivación para proporcionar información de cliente / sesión / ventana / panel a los run-shellcomandos. Hay una entrada TODO sobre cómo obtener if-shelly run-shellapoyar (¿opcional?) status_replace()(Es decir, status-leftsustituciones de estilo), aunque tal vez sería una mejor opción format_expand(), que es una especie de superconjunto más nuevo de status_replace(ofertas #{client_tty}, etc.).

Chris Johnsen
fuente
Esto parece hacer exactamente lo que estaba buscando. Había intentado un método similar después de encontrar el tmux display-message -p "#S"truco en otra respuesta. Parece que envolver todo en run-shell fue la clave. ¡Gracias!
Trey Hunner
¿Cómo haces esto sin confirm-before? Estoy teniendo problemas para escapar bien.
Miles
2
@Miles: Pruebe este: bind-key X run-shell 'tmux switch-client -n \; kill-session -t "#S"'( tmux 1.8+ se run-shellexpande #Sdirectamente, por lo que podemos omitir el display-messagey su cita adicional)
Chris Johnsen
1

Por si acaso, si alguien se topa con esta pregunta, tmux-sessionist proporciona esta funcionalidad junto con muchas otras.

anni
fuente
0

Hay otra pregunta que hace una pregunta similar pero es ligeramente diferente.

Si desea el choose-sessioncomportamiento estándar con la función adicional que mata la sesión original si no quedan otros clientes vinculados a ella, entonces esa pregunta también puede ser de interés.

starfry
fuente
0

Ampliando la respuesta de Chris Johnsen (en los comentarios) arriba, sobre cómo hacerlo sin aviso o confirm-before:

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

Si solo queda 1 sesión (la sesión en la que se encuentra actualmente) y ejecuta el comando, recibirá un mensaje de "error" y la sesión no se cancela. Normalmente (si eres como yo) quieres que el comando siga matando la sesión aunque no haya otra sesión a la que pueda cambiar. Entonces esto es lo que se me ocurre:

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
fuente