Per pulire il casino sono necessarie due sequenze di comandi:
Innanzitutto, eseguilo nella finestra confusa (funziona anche quando sei dentro ssh):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Quindi eseguilo sul computer che esegue tmux(funziona all'interno e all'esterno di tmux):
Il seguente comando ha effetto su tutte le tmuxistanze, che possono modificare lo stato sinistro di più della finestra corrente. Se non hai bisogno di quella funzione, lasciala perdere.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Spiegato in dettaglio
Questo è stato assemblato per rispondere a tutti i bit trovati in altre risposte e commenti. Al momento sembra che sia rimasto solo un piccolo bit con il secondo comando. (Vedi nel "bit mancante" di seguito).
Per capire come funziona, per prima cosa uccidiamo la linea di stato di tmuxe il tty. Successivamente lo correggiamo di nuovo, usando un metodo che dovrebbe essere sempre disponibile (diversamente dal comando reset).
Come rendere un tmuxterminale (presuppone UTF-8) inutilizzabile
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Avvertenza: dopo aver eseguito il comando sopra, la shell sembra cieca e sorda e sembra parlare solo di cazzate in un linguaggio alieno sconosciuto. Vedi sotto su come ripararlo.
Ha spiegato:
stty -echo uccide la risposta di tipo terminale
printf '\016'fa un SO, quindi sei nel set di caratteri alternativo
printf '\033]2;%s\007' 'right status text'imposta lo stato giusto, in questo caso $'\355', che espone un bug di presentazione
printf '\033k%2000s\033\\' $'\302\217' imposta il nome del titolo della finestra
Questa potrebbe essere la combinazione che puoi vedere sul terminale dopo che un comando interattivo si è schiantato e ricaduto nella shell. (Con /bin/catte non puoi provocare stty -echoIMHO, ma comandi interattivi come di vimsolito impostano questo.)
Ora pulisci questo casino
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Nota: se usi copia e incolla (probabilmente dovrai tenere premuto Shiftmentre incolli ), probabilmente non puoi vedere il tuo incolla se hai usato il comando sopra per confondere il tuo tty. Quindi, basta premere alla cieca il tasto Invio dopo averlo incollato.
Ha spiegato:
stty sane imposta i parametri del terminale "sano", in modo da recuperare l'eco durante la digitazione
printf '\033k%s\033\\' "$(basename "$SHELL")"riporta il titolo della finestra su normale. Puoi usarlo in tmux rename-window "$(basename "$SHELL")"alternativa, tuttavia tmux rename-windowè limitato a tmuxdove funziona sempre la sequenza di escape.
printf '\033]2;%s\007' "$(uname -n)"ripristina il diritto di stato per essere mostrato come predefinito. (Nota che non dovresti usare tmux set status-right "something", perché genera solo quello pane titleche è stato corrotto, quindi status-rightespone solo alcuni bug di presentazione. Nota anche che non ho trovato un tmuxcomando per impostare direttamente il titolo del riquadro.)
tput reset ripristina il terminale, nel caso in cui ciò sia stato risolto
tmux refresh aggiorna lo schermo per sbarazzarsi di altri detriti che potrebbero essere stati visualizzati
Pezzo mancante
La printf '\033k%s\033\\' "$(basename "$SHELL")"perde la capacità standard tmuxdi presentare il comando corrente nell'area di stato sinistra. Dopo che è printf '\033k%s\033\\' "something"stata eseguita questa abilità si perde e non ho ancora trovato un buon modo per riportarla com'era prima.
Ma, come notato nei commenti qui sotto, puoi attivare una funzione simile tmuxcome sostitutiva con le seguenti tmuximpostazioni:
set-window-option automatic-rename on
O fare questo nella tmuxriga di comando, che può essere raggiunta nella finestra corrente con "Escape" :(dove "Escape" è il tmuxtasto di comando) e quindi immettere il comando.
Oppure esegui l'escissione tmux set-window-option automatic-rename onnel tuo terminale corrente, ma ciò fallisce nel caso in cui non sei direttamente al livello di shell giusto, ad esempio non funziona all'interno sudoo ssh.
Oppure apri un'altra finestra nella tmuxsessione corrente ed esegui il seguente comando:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Oppure apri un'altra shell sul computer che è in esecuzione tmuxed esegui il comando seguente (al di fuori di tmux):
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
PS: Grazie a tutti coloro che hanno contribuito a mettere insieme questa soluzione.