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 tmux
istanze, 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 tmux
e il tty
. Successivamente lo correggiamo di nuovo, usando un metodo che dovrebbe essere sempre disponibile (diversamente dal comando reset
).
Come rendere un tmux
terminale (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/cat
te non puoi provocare stty -echo
IMHO, ma comandi interattivi come di vim
solito 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 Shift
mentre 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 tmux
dove 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 title
che è stato corrotto, quindi status-right
espone solo alcuni bug di presentazione. Nota anche che non ho trovato un tmux
comando 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 tmux
di 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 tmux
come sostitutiva con le seguenti tmux
impostazioni:
set-window-option automatic-rename on
O fare questo nella tmux
riga di comando, che può essere raggiunta nella finestra corrente con "Escape" :
(dove "Escape" è il tmux
tasto di comando) e quindi immettere il comando.
Oppure esegui l'escissione tmux set-window-option automatic-rename on
nel tuo terminale corrente, ma ciò fallisce nel caso in cui non sei direttamente al livello di shell giusto, ad esempio non funziona all'interno sudo
o ssh
.
Oppure apri un'altra finestra nella tmux
sessione 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 tmux
ed 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.