完成时在显示屏上重复的命令的第一个字符

jil*_*len 25 zsh line-editor oh-my-zsh

前两个字符在我Tab用来完成时重复。在下面的屏幕截图中,cd重复了。

在此处输入图片说明

我试过 rxvt-unicdoe、xterm、终结者。所有这些终端模拟器都有这个问题。

Zsh 版本 5.0.2,配置文件on-my-zsh

Gil*_*il' 39

如果命令行上的字符有时显示在偏移处,这通常是因为 zsh 计算了错误的提示宽度。症状是,只要您添加字符或逐个字符移动,显示看起来就很好,但是当您使用其他移动光标的命令(Home、完成等) 或当命令与第二行重叠时。

zsh 需要知道提示符的宽度才能知道命令的字符放在哪里。除非另有说明,否则它假定每个字符占据一个位置。

一种可能性是您的提示包含未正确分隔的转义序列。更改文本的颜色或其他格式方面,或者更改窗口标题或其他效果的转义序列的宽度为零。它们需要包含在百分比大括号构造中%{…%}。更一般地,像这样的转义序列%42{…%}告诉 zsh 假设大括号内的内容是 42 个字符宽。

因此,请检查您的提示设置(PS1PROMPT或它们引用的变量)并确保所有转义序列(例如\e[…m更改文本属性 - 请注意它可能通过诸如 之类的变量存在$fg[red])都在%{…%}. 由于您使用的是 oh-my-zsh,请检查您自己的设置和您在 oh-my-zsh 中使用的定义。

同样的问题出现在 bash 中。提示中的零宽度序列需要包含在\[…\].

另一种可能性是您的提示包含非 ASCII 字符,并且 zsh(或任何其他应用程序)和您的终端对它们的宽度有不同的想法。如果终端的编码与 shell 中声明的编码不匹配,并且这两种编码导致某些字节序列的宽度不同,就会发生这种情况。通常,在使用非 Unicode 终端但声明 Unicode 语言环境时,您可能会遇到此问题,反之亦然。

应用程序依赖环境变量来了解语言环境;相关设置是LC_CTYPE,它是从环境变量确定LANGUAGELC_ALLLC_CTYPELANG(这些在第一即组内)。该命令会locale | grep LC_CTYPE告诉您当前的设置。通常避免语言环境问题的最好方法是让终端模拟器 set LC_CTYPE,因为它知道它期望什么编码;但如果这对您不起作用,请确保设置LC_CTYPE.

当上一个命令显示一些未以换行符结尾的输出时,可能会出现相同的症状,因此提示显示在行的中间,但 shell 没有意识到这一点。在这种情况下,这只会在运行这样的命令后发生,而不是持续发生。

如果一行显示不正确,命令redisplayclear-screen(默认绑定到Ctrl+ L)将修复它。

  • 我忘了设置语言环境(我使用的是 archlinux,默认情况下没有设置语言环境)。设置 locale 后,这个问题就解决了。非常感谢,伙计!!!! (2认同)

小智 17

我遇到了同样的问题,并在这里找到了我的解决方案:https : //github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519。只需将以下内容放入您的~/.zshrc.

export LC_CTYPE=en_US.UTF-8

  • 谢谢你的提示!然而,我不得不重置我正在使用的整个“区域设置”,但它对我有用。[这个答案](http://askubuntu.com/a/227513) 提供了 Ubuntu 的必要步骤。 (2认同)