详细解释

详细解释

cat在处理二进制文件后,我不小心搞砸了我的 tmux 终端。现在我的tmux已经乱了。分离和重新连接没有帮助,重绘 (Cb r) 也没有帮助。运行reset只会重绘活动窗格,而不重绘其余窗格。ssty sane无论是在室内还是室外跑步tmux都没有帮助。

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'执行 a SO,因此您处于备用字符集上

  • 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")"的标准能力。被执行tmuxprintf '\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`
    
  • 或者打开正在运行的计算机的另一个 shelltmux并执行以下命令(这是在 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 

当窗口名称以外的其他内容损坏并且我懒得去弄清楚它是什么时,为我修复了这个问题。

相关内容