使用 ack-vim 插件时,我的窗口中的字体会不时变为所有符号。当这种情况发生时,我还没有看到任何模式。任何有关原因和可能的补救措施的建议将不胜感激。
2 回答
当二进制内容打印到终端时,我已经看到了这种情况。您的 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.
这看起来像 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中“泄漏”出来以切换外部终端的字符集。