cat
在处理二进制文件后,我不小心搞砸了我的 tmux 终端。现在我的tmux
已经乱了。分离和重新连接没有帮助,重绘 (Cb r) 也没有帮助。运行reset
只会重绘活动窗格,而不重绘其余窗格。ssty sane
无论是在室内还是室外跑步tmux
都没有帮助。
在每个窗格中,我都从我输入的内容中得到正常的反馈(终端搞乱后立即进行的初始调用reset
解决了这个问题),但我似乎无法修复状态栏。
在 中gnome-terminal
,状态栏的每次更新都会导致状态栏增大(请参见上面的屏幕截图)。例如,当我运行新应用程序、切换窗格或调整窗格大小时,就会发生这种情况。强制重绘(通过C-b r
、运行reset
或通过 gnome 终端菜单)会将状态栏缩小到一行,但它仍然损坏。
在 中xterm
,状态栏确实保留在一行内,但它仍然损坏,如图所示。
我正在使用 tmux 1.5。
- 如何修复我的
tmux
-terminal?
此错误报告from 2008 似乎描述了同样的问题,但它被标记为已修复。我不知道它是在哪个版本中修复的,但 tmux 1.5 应该包含 2008 年的修复。
答案1
尝试重命名窗口 4
- 切换到窗口 4: Control+b 4
- 重命名窗口:Control++ b , ControlmyNewnameu
(中间有一个逗号)
或者:Control+b :rename-window myNewname
答案2
您需要两个命令序列来清理混乱:
首先,在乱码窗口中运行此命令(即使您处于ssh
):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
然后在运行的计算机上运行它tmux
(它在 内部和外部工作tmux
):
以下命令影响所有
tmux
实例,这可能会改变多个当前窗口的左侧状态。如果您不需要该功能,请将其保留。
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
详细解释
汇总此内容是为了解决其他答案和评论中发现的所有内容。目前第二个命令似乎只剩下一小部分了。 (参见下面的“缺失位”)。
tmux
要了解这是如何工作的,让我们首先删除和 的状态行tty
。之后我们使用应该始终可用的方法再次更正它(与 command 不同reset
)。
如何使tmux
终端(假设UTF-8
)无法使用
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
警告:运行上面的命令后,shell看起来又瞎又聋,似乎只会用某种未知的外星语言说废话。请参阅下文了解如何修复此问题。
解释:
stty -echo
终止终端类型响应printf '\016'
执行 aSO
,因此您处于备用字符集上printf '\033]2;%s\007' 'right status text'
设置正确的状态,在本例中为$'\355
',这会暴露一个演示错误printf '\033k%2000s\033\\' $'\302\217'
设置窗口标题名称
这可能是在某些交互式命令崩溃并返回到 shell 后您可以在终端上看到的组合。 (恕我直言,/bin/cat
你不能激怒stty -echo
,但交互式命令vim
通常会设置这个。)
现在清理这个烂摊子
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
笔记:如果您使用复制和粘贴(您可能需要
Shift
在粘贴时按住),并且使用上述命令弄乱了您的tty
.因此,粘贴后直接按 Enter 键即可。
解释:
stty sane
设置“正常”的终端参数,以便您在键入时得到回声printf '\033k%s\033\\' "$(basename "$SHELL")"
将窗口标题设置回正常状态。您可以tmux rename-window "$(basename "$SHELL")"
选择使用,但tmux rename-window
仅限于tmux
转义序列始终有效的地方。printf '\033]2;%s\007' "$(uname -n)"
将状态权限重置为默认显示。 (请注意,您不应该使用tmux set status-right "something"
,因为它只输出pane title
损坏的内容,因此status-right
只会暴露一些演示错误。另请注意,我没有找到tmux
直接设置窗格标题的命令。)tput reset
重置终端,以防万一这已经被搞乱了tmux refresh
刷新屏幕以清除可能出现的其他碎片
缺少位
失去了在左侧状态区域中显示当前命令printf '\033k%s\033\\' "$(basename "$SHELL")"
的标准能力。被执行tmux
后printf '\033k%s\033\\' "something"
这个能力就消失了,我也没有找到好的方法,但是如何恢复到原来的样子。
但是,正如下面的评论中所述,您可以使用以下设置激活类似的功能tmux
作为替代tmux
:
set-window-option automatic-rename on
可以在
tmux
命令行中执行此操作,可以使用“Escape”在当前窗口中访问该命令行:
(其中“Escape”是您的tmux
命令键),然后输入命令。或者在当前终端中执行
tmux set-window-option automatic-rename on
,但如果您不直接位于正确的 shell 级别,则此操作会失败,例如它无法在sudo
或中工作ssh
。或者在当前
tmux
会话中打开另一个窗口并执行以下命令:for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
或者打开正在运行的计算机的另一个 shell
tmux
并执行以下命令(这是在 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:感谢所有帮助组装此解决方案的人。
答案3
您看到的具体问题与窗口 4 的名称/标题有关。太长(显然)和包含奇怪字符的组合导致 tmux 将其测量为较短(因此它无法正确限制状态栏到屏幕的宽度)我不确定如何重置它(在我的系统上它跟踪前台进程的名称),您可能必须关闭窗口。
答案4
tmux set-option -g status off && tmux set-option -g status on
当窗口名称以外的其他内容损坏并且我懒得去弄清楚它是什么时,为我修复了这个问题。