2012-09-24 12 views
5

Io aiuto a mantenere un gran numero di server simili a Unix, quindi mantengo uno script chiamato tmux-rebuild che uso per ricostruire tutte le sessioni tmux e windows con collegamenti SSH a ciascun server.Come cancellare lo stato di campana da tutte le finestre tmux

Ho tmux configurato per mostrare il nome della finestra in rosso con un punto esclamativo nella sua barra di stato quando un carattere campanello terminale viene stampato in quella finestra. Questo è molto utile per programmi come irssi che mi avvisano quando ho messaggi in un'altra finestra.

Ho anche il mio $PS1 impostato su ogni server per stampare un campanello terminale alla fine di ogni prompt. Questo è utile perché se eseguo un lavoro lungo in una finestra e passa a un altro, posso vedere immediatamente quando è finito perché quando il mio prompt viene scritto sullo schermo dopo che il lavoro è finito, tmux fa apparire il nome della finestra in rosso con un punto esclamativo. Questo è ottimo per il mio flusso di lavoro.

Tuttavia provoca un piccolo problema con lo script di ricostruzione menzionato sopra, perché quando avvio tmux dopo averlo eseguito, ogni finestra in ogni sessione è contrassegnata in rosso, a causa del primo prompt che viene stampato sullo schermo. Ciò rende la funzionalità inutile finché non visito tutte le finestre e ce ne sono circa 40-50.

C'è qualcosa che posso aggiungere al mio script che cancellerà tutti gli avvisi da sessioni e finestre dopo che sono stati creati? Non mi dispiace usare un kludge se necessario.

risposta

5

Calcolato una soluzione accettabile; Ho ridefinito i prossimi attacchi/precedenti per consentire ripete:

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

Questo mi permette di spazzare rapidamente gli allarmi per tutte le finestre in una sessione premendo la mia chiave di prefisso e toccando "n" fino a quando sono tutto chiaro, e sono tornato nella mia finestra originale.

+0

Soluzione davvero buona! Dovresti accettarlo come risposta. – haridsv

+1

BTW, probabilmente dovresti ridurre il 'repeat-time' dal' 500ms' predefinito a qualcosa di più piccolo, come '200ms' o potrebbe interferire con la tua successiva digitazione. – haridsv

4

Con tmux 1.6 (e successive), list-windows possono generare in uscita personalizzabile, quindi è abbastanza semplice da leggere le linee di uscita e fare un ciclo che viene eseguito select-window per ogni finestra.

Aggiungi list-session (a loop su tutte le sessioni, opzionalmente), e display-message (per analizzare prescrittori di sessione, e per registrare i/windows correnti “ultimi” in modo che possano essere adeguatamente restaurato), e si potrebbe finire con qualcosa di simile questo:

#!/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

Dalla pagina tmux uomo, in particolare l'ultima frase qui:

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. 

Così, semplicemente:

kill-session -C 
+0

Lo uso dopo aver salvato le sessioni con tmux-resurrect (che ottiene le campane perché salvano tutte la cronologia): 'esegui X esegui 'tmux list-sessions -F" ## S "| xargs -n1 tmux kill-session -C -t '' – unhammer

Problemi correlati