1

使用 ack-vim 插件时,我的窗口中的字体会不时变为所有符号。当这种情况发生时,我还没有看到任何模式。任何有关原因和可能的补救措施的建议将不胜感激。

屏幕他妈的

4

2 回答 2

4

当二进制内容打印到终端时,我已经看到了这种情况。您的 Ack 查询是否可能包含二进制文件?

修复可能是

:!echo -e '\ec\e(K\e[J'

这些 ANSI Escape 序列尝试重置终端:

# "ESC c"        - sends reset to the terminal.
# "ESC ( K"      - reloads the screen output mapping table.
# "ESC [ J"      - erases display.
于 2013-10-08T06:56:53.777 回答
0

这看起来像 Shift Out 控制字符启用的典型字符集转换;您通常只需要发送 Shift In 控制字符来抵消它。

基本上,某些东西正在输出一个 Cn 字符(Control-N,U+000E,名为 Shift Out),它告诉您的终端切换到不同的显示字符集。您应该能够通过向终端发送 Co(Control-O,U+000F,名为 Shift In)来让终端切换回正常显示字符集。

如果您在 Vim 中,那么您可能可以使用如下命令发送 Co:

:!printf \\017

您将不得不“盲目地”输入(或粘贴)此命令,因为(由于备用字符集)您可能无法阅读您正在输入的内容。如果您正在键入它(不是粘贴),那么您也可以键入 Cv Co(插入单个文字 Co)而不是反斜杠八进制,如果这样更容易记住的话。

如果您发现此问题仅在使用 vim-ack 插件时偶尔出现,那么可能某些文本结果包含有问题的 Shift Out 字符。您可以尝试使用如下命令搜索文件:

 grep -FRl $(printf \\016) .

一旦您知道文件的名称,您就应该能够使用 Vim 搜索字符(开始搜索并输入 Cv Cn 以插入文字 Cn)。也许这只是一些您可以清理的垃圾,或者您可以配置基于ack的搜索以排除有问题的文件。


您还用 标记了问题tmux。我不能确定,但​​看起来顶行可能是tmux状态行。由于此行也已损坏,因此表明您的外部终端仿真器已切换字符集,而不仅仅是您的tmux窗格之一。

如果您将 Shift Out 或 Shift In 直接发送到tmux窗格,它只会影响该窗格(每个窗格都是独立模拟的),因此您的状态不能仅仅被一个流浪的 Shift Out 击中单个窗格所改变。

如果您在tmux内部运行,那么重置外部终端的最简单方法是暂停和恢复您的 tmux 客户端(或分离并重新连接到您的会话)。tmux在放弃控制权时几乎会重置外部终端。

根据具体情况,您可能还必须通过发送 Co来重置tmuxprintf \\017窗格的字符集(即在 shell 或:!Vim 中的提示符处)。

很容易看出一个杂散的 Shift Out 如何重新配置​​单个tmux窗格,但很难看出它是如何“泄漏”出来以重新配置外部终端(tmux非常擅长隔离这样的事情)。然而,有一个tmux识别的控制序列指示它直接将数据传递到外部终端(因此“泄漏”),但是你随机遇到这个序列的可能性要小得多,因为它要长得多:

printf '\ePtmux;%s\e\\' 'stuff bound for the external terminal'

您可以使用它来发送恢复性 Shift In,如下所示:

printf '\ePtmux;%s\e\\' $(printf \\017)

您还需要告诉tmux在此之后重绘自身(默认情况下,该refresh-client命令绑定到 Cb r)。

挂起和恢复(或分离和重新连接)可能更容易,但如果不可能,这个顺序很有用。它还提供了一种方法来了解哪种序列可能从tmux中“泄漏”出来以切换外部终端的字符集。

于 2013-10-08T09:42:39.290 回答