tmux status-bar corrupted after catting a binary file, how to reset?
Try renaming window 4
- Switch to window 4: Control+b 4
- Rename window: Control+b , Control+u myNewname
(Thats a comma in the middle)
Or: Control+b :rename-window myNewname
You need two command sequences to cleanup the mess:
First, run this in the garbled window (this works even when you are in ssh
):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Then run this on the computer which runs tmux
(it works inside and outside of tmux
):
The following command affects all
tmux
instances, which may change the left status of more than the current window. If you do not need that feature, leave it away.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Explained in detail
This was assembled to address all the bits found in other answers and comments. There currently seems only a minor bit left with the second command. (See in the "missing bit" below).
To understand how this works, let us first kill the status line of tmux
and the tty
. Afterwards we correct it again, using a method which should be always available (unlike command reset
).
How to make a tmux
terminal (assumes UTF-8
) unusable
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Warning: After running above command, the shell looks blind and deaf and seems only to talk bullshit in some unknown alien language. See below on how to repair this.
Explained:
stty -echo
kills the terminal type responseprintf '\016'
does aSO
, so you are on the alternate character setprintf '\033]2;%s\007' 'right status text'
sets the right status, in this case$'\355
', which exposes a presentation bugprintf '\033k%2000s\033\\' $'\302\217'
sets the window title name
This might be the combination you can see on the terminal after some interactive command crashed and dropped back into the shell. (With /bin/cat
you cannot provoke stty -echo
IMHO, but interactive commands like vim
usually set this.)
Now clean up this mess
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Note: If you use copy and paste (you probably need to hold down
Shift
while pasting), you probably cannot see your paste if you have used the above command to mess up with yourtty
. Hence, just blindly press the Enter key after pasting this.
Explained:
stty sane
sets "sane" terminal parameters, so you get back your echo while typingprintf '\033k%s\033\\' "$(basename "$SHELL")"
sets the window title back to normal. You can usetmux rename-window "$(basename "$SHELL")"
alternatively, howevertmux rename-window
is limited totmux
where the escape sequence always works.printf '\033]2;%s\007' "$(uname -n)"
resets the status-right to be shown as default. (Note that you should not usetmux set status-right "something"
, because it just outputs thepane title
which got corrupt, sostatus-right
just exposes some presentation bug. Also note, that I did not find atmux
command to set the pane title directly.)tput reset
resets the terminal, just in case this has been messed withtmux refresh
refreshes the screen to get rid of other debris which might have shown up
Missing bit
The printf '\033k%s\033\\' "$(basename "$SHELL")"
looses the standard ability of tmux
to present the current command in the left status area. After printf '\033k%s\033\\' "something"
was executed this ability is lost and I did not find a good way, yet, how to bring it back as it was before.
But, as noted in the comments below, you can activate a similar feature of tmux
as a replacement with following tmux
setting:
set-window-option automatic-rename on
Either do this in the
tmux
command line, which can be reached in the current window with "Escape":
(where "Escape" is yourtmux
command key) and then enter the command.Or excute
tmux set-window-option automatic-rename on
in your current terminal, but this fails in case you are not directly on the right shell level, for example it does not work withinsudo
orssh
.Or open another window in the current
tmux
session and execute following command:for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Or open another shell to the computer which is running
tmux
and execute following command (this is outside of 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: Thanks to all who helped to assemble this solution.
The specific problem you are seeing has to do with the name/title of window 4. A combination of being too long (obviously) and containing strange characters which cause tmux to measure it as being shorter (so it fails to properly limit the status bar to the width of the screen) I am not sure how to reset it (on mine it tracks the name of the foreground process), you may have to close the window.