tmux 状态栏在 catting 二进制文件后损坏,如何重置?

ger*_*rit 105 tmux

cat输入二进制文件后,我不小心搞砸了我的 tmux 终端。现在我tmux的搞砸了。分离和重新连接无济于事,重绘 (Cb r) 也无济于事。运行reset仅重绘活动窗格,而不是其余部分。ssty sane在室内或室外跑步也tmux无济于事。

tmux 搞砸了

在每个窗格中,我都从我输入的内容中得到正常的反馈(reset终端搞砸后立即的初始调用解决了这个问题),但我似乎无法修复状态栏。

在 中gnome-terminal,状态栏的每次更新都会导致状态栏增长(见上面的截图)。例如,当我运行一个新应用程序、切换窗格或调整窗格大小时,就会发生这种情况。强制重绘(通过C-b r、通过运行reset或通过 gnome-terminal 菜单)将状态栏缩小到一行,但它仍然损坏。

在 中xterm,状态栏确实保留在一行内,但如图所示仍然损坏。

我正在使用 tmux 1.5。

  • 如何修复我的tmux终端?

这个2008 年的错误报告似乎描述了同样的问题,但它被标记为已修复。我不知道它是在哪个版本中修复的,但 tmux 1.5 应该包含 2008 年的修复。

Rqo*_*mey 91

尝试重命名窗口 4

  • 切换到窗口 4: Control+b 4
  • 重命名窗口:Control+ b , Control+ umyNewname

(中间是逗号)

或:Control+b :rename-window myNewname

  • 在键入新名称之前,您需要清除名称。最简单的方法是使用`ctrl+u`,所以完整的序列是`ctrl+b , ctrl+u newname` (4认同)
  • 重命名窗口就像一个魅力 (2认同)

Tin*_*ino 68

您需要两个命令序列来清理混乱:

首先,在乱码窗口中运行此命令(即使您在 中也能正常工作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

详细解释

这是为了解决其他答案和评论中的所有问题。目前似乎只剩下第二个命令了。(参见下面的“缺失位”)。

要理解这是如何工作的,让我们先杀掉的状态行tmuxtty。之后我们再次更正它,使用应该始终可用的方法(与 command 不同reset)。

如何使tmux终端(假设UTF-8)无法使用

stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Run Code Online (Sandbox Code Playgroud)

警告:运行以上命令后,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
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用复制和粘贴(您可能需要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
Run Code Online (Sandbox Code Playgroud)
  • 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`
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者打开另一个 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
    
    Run Code Online (Sandbox Code Playgroud)

PS:感谢所有帮助组装此解决方案的人。

  • 请注意 `uname -n` 而不是 `hostname -s`。`hostname` 在 `root` 上下文中是危险的,因为你可能最终将你的主机重命名为 `-s` 在旧的 Linux/Unix 上,其中 `hostname` 不了解选项。 (2认同)
  • 修复窗口标题后还要考虑“tmux setw自动重命名” (2认同)

Ran*_*832 26

您看到的具体问题与窗口 4 的名称/标题有关。 太长(显然)和包含奇怪字符的组合导致 tmux 将其测量为较短(因此它无法正确限制状态栏到屏幕的宽度)我不知道如何重置它(我的它跟踪前台进程的名称),您可能需要关闭窗口。

  • 以防@Rob 评论中的键盘快捷键让您感到困惑,它是`Ctrl`-`b` 然后是`,`。 (8认同)
  • 默认重命名窗口是`^b - ,` (4认同)

小智 5

简单地做这个 $ reset && tmux rename-window <new_window_name>


小智 5

tmux set-option -g status off && tmux set-option -g status on 
Run Code Online (Sandbox Code Playgroud)

当窗口名称以外的其他东西被破坏时,我为我修复了这个问题,我无法费心去弄清楚它是什么。