使用ack-vim插件时,我的窗口中的字体将变为所有符号。当发生这种情况时,我还没有看到任何模式。任何关于原因和可能的补救措施的建议都将受到赞赏。
答案 0 :(得分:4)
我已经看到,当二进制内容被打印到终端时会发生这种情况。您的Ack查询是否可能包含二进制文件?
修复可能是
:!echo -e '\ec\e(K\e[J'
这些ANSI转换序列尝试重置终端:
# "ESC c" - sends reset to the terminal.
# "ESC ( K" - reloads the screen output mapping table.
# "ESC [ J" - erases display.
答案 1 :(得分:0)
这看起来像是由Shift Out控制字符启用的典型字符集转换;你通常只需要发送Shift In控制字符来抵消它。
基本上,有些东西正在输出一个C-n字符(Control-N,U + 000E,名为Shift Out),它告诉终端切换到不同的显示字符集。您应该能够通过向其发送C-o(Control-O,U + 000F,名为Shift In)来切换回正常显示字符集。
如果你在Vim,那么你可以用这样的命令发送C-o:
:!printf \\017
您必须“盲目地”键入(或粘贴)此命令,因为(由于备用字符集)您可能无法读取您正在键入的内容。如果你输入它(不粘贴),那么你也可以输入C-v C-o(插入单个文字C-o)而不是反向八进制,如果这更容易记住。
如果您发现在使用vim-ack插件时偶尔会出现此问题,那么可能某些文本结果包含有问题的Shift Out字符。您可以尝试使用以下命令搜索文件:
grep -FRl $(printf \\016) .
一旦知道文件名,就可以使用Vim搜索字符(开始搜索并键入C-v C-n以插入文字C-n)。也许这只是一些可以清理的垃圾,或者你可以配置基于 ack 的搜索来排除有问题的文件。
您还使用tmux
标记了问题。我无法确定,但看起来顶线可能是 tmux 状态行。由于此行也已损坏,因此表示您的外部终端仿真器已切换字符集,而不仅仅是您的 tmux 窗格之一。
如果您将Shift Out或Shift In直接发送到 tmux 窗格,它只会影响该窗格(每个窗格都是独立模拟的),因此您的状态就像一个流浪者一样Shift Out命中单个窗格。
如果您在 tmux 中运行,那么重置外部终端的最简单方法是暂停和恢复您的tmux客户端(或从您的会话中分离并重新连接到您的会话)。 tmux 在放弃控制时几乎会重置外部终端。
根据具体情况,您可能还必须通过发送Co来重置 tmux 窗格的字符集(即printf \\017
在shell或{{{ 1}}在Vim中提示。)
很容易看出迷失Shift Out如何重新配置单个 tmux 窗格,但很难看出它如何“泄漏”以重新配置外部终端( tmux 很擅长隔离这样的东西)。但是,有一个 tmux 识别的控制序列指示它将数据直接传递到外部终端(因此“泄漏”),但是你不太可能随机地遇到这个序列。它要长得多:
:!
您可以使用它来发送恢复性的Shift In:
printf '\ePtmux;%s\e\\' 'stuff bound for the external terminal'
此后,您还需要告诉 tmux 重绘自己(默认情况下,printf '\ePtmux;%s\e\\' $(printf \\017)
命令绑定到C-b r)。
暂停和恢复(或分离和重新附加)可能更容易,但如果不可能,则此序列很有用。它还提供了一种方法,可以了解哪种序列可能会从 tmux 中“泄漏”以切换外部终端的字符集。