2012-09-24 9 views
5

Ayudo a mantener una gran cantidad de servidores tipo Unix, y guardo un script llamado tmux-rebuild que utilizo para reconstruir todas las sesiones de tmux y ventanas con enlaces SSH a cada servidor.Cómo borrar el estado de la campana de todas las ventanas de tmux

He configurado tmux para mostrar el nombre de la ventana en rojo con un signo de exclamación en su barra de estado cuando un personaje campana del terminal se imprime en esa ventana. Esto es muy útil para programas como irssi alertándome cuando tengo mensajes en otra ventana.

También tengo mi $PS1 establecido en cada servidor para imprimir una campana del terminal al final de cada símbolo. Esto es útil porque si ejecuto un trabajo largo en una ventana y cambio a otra, puedo ver de inmediato cuándo ha finalizado, porque cuando mi mensaje se escribe en la pantalla una vez finalizado el trabajo, tmux hace que el nombre de la ventana aparezca en rojo con un signo de exclamación. Esto es genial para mi flujo de trabajo.

Sin embargo, causa un pequeño problema con el script de reconstrucción mencionado anteriormente, porque cuando inicio tmux después de ejecutarlo, cada ventana en cada sesión se marca en rojo, debido a que el primer mensaje se imprime en la pantalla. Esto hace que la función sea inútil hasta que visite todas las ventanas, y hay algo así como 40-50 de ellas.

¿Hay algo que puedo añadir a mi script que va a borrar todas las alertas de sesiones y ventanas después de su creación? No me importa usar un kludge si es necesario.

Respuesta

5

descubierto una solución aceptable; Redefiní los próximos fijaciones/anterior para permitir que se repite:

# Allow repeats for next/prev window 
bind-key -r n next-window 
bind-key -r p previous-window 

Esto me permite barrer rápidamente las alertas para todas las ventanas en una sesión presionando la llave prefijo y tocando "n" hasta que todos ellos son claras, y estoy de vuelta en mi ventana original.

+0

Muy buena solución! Debes aceptar esto como una respuesta. – haridsv

+1

Por cierto, lo más probable sería necesario reducir el 'repetición tiempo' del defecto' 500ms' a algo más pequeño, como '200ms' o podría interferir con su escritura posterior. – haridsv

4

Con tmux 1.6 (y posteriores), list-windows puede generar la salida personalizable, por lo que es bastante fácil de leer las líneas de salida y hacer un bucle que se ejecuta select-window para cada ventana.

Agregue list-session (para realizar un ciclo en todas las sesiones, opcionalmente) y display-message (para analizar los especificadores de sesión y para registrar las ventanas actuales/"últimas" para que se puedan restaurar correctamente), y puede terminar con algo como esto:

#!/bin/sh 

# usage: tmux-select-each [session [...]] 
# 
# Select every window in specified session(s). If no sessions are 
# specified, process all windows in all sessions. 
# 
# This can be handy for clearing the activity flags of windows in 
# freshly spawned sessions. 

if test $# -gt 0; then 
    for session; do 
     tmux display-message -p -t "$session:" '#S' 
    done 
else 
    tmux list-sessions -F '#{session_name}' 
fi | 
while read -r session; do 
    active_window=$(tmux display-message -p -t "$session:" '#S:#I') 
    last_window=$(tmux display-message -p -t "$session:"\! '#S:#I' 2>/dev/null) 
    tmux list-windows -t "$session" -F '#{session_name}:#{window_index}' | 
    while read -r window; do 
     if test "$window" = "$active_window" || 
      test "$window" = "$last_window"; then 
      continue 
     fi 
     tmux select-window -t "$window" 
    done 
    if [ -n "$last_window" ]; then 
     tmux select-window -t "$last_window" 
    fi 
    tmux select-window -t "$active_window" 
done 
1

Desde la página del tmux, específicamente la última frase aquí:

kill-session [-aC] [-t target-session] 
      Destroy the given session, closing any windows linked to it 
      and no other sessions, and detaching all clients attached 
      to it. If -a is given, all sessions but the specified one is 
      killed. The -C flag clears alerts (bell, activity, or 
      silence) in all windows linked to the session. 

Por lo tanto, simplemente:

kill-session -C 
+0

Yo uso este después de guardar sesiones con tmux-resucitar (que reciben las campanas, ya que todo Guardar la historia): 'bind X run 'list-TMux sesiones -F "## S" | xargs n1 tmux matar a sesiones -C -t '' – unhammer

Cuestiones relacionadas