Tab当我用来完成时,前两个字符被重复。在下面的屏幕截图中,cd
重复了。
我尝试过 rxvt-unicdoe、xterm、终结者。所有这些终端模拟器都有这个问题。
Zsh 版本 5.0.2,配置文件在我的 zsh 上
答案1
如果命令行上的字符有时会以偏移量显示,这通常是因为 zsh 计算了错误的提示宽度。症状是,只要您添加字符或逐个字符移动,显示看起来就很好,但当您使用其他移动光标的命令(Home、补全等)时,显示就会出现乱码(某些字符显示得比应有的更靠右)。 ) 或者当命令与第二行重叠时。
Zsh 需要知道的宽度迅速的为了知道命令的字符放置在哪里。除非另有说明,否则它假定每个字符占据一个位置。
一种可能是您的提示包含转义序列没有正确界定。更改文本的颜色或其他格式设置,或者更改窗口标题或其他效果的转义序列的宽度为零。他们需要包含在百分号大括号结构中%{…%}
。更一般地说,像这样的转义序列%42{…%}
告诉 zsh 假设大括号内的内容是 42 个字符宽。
因此,请检查您的提示设置(PS1
、PROMPT
或它们引用的变量),并确保所有转义序列(例如\e[…m
更改文本属性 - 请注意,它可能通过某些变量(例如 )出现$fg[red]
)都在 内%{…%}
。由于您使用的是 oh-my-zsh,请检查您自己的设置以及您在 oh-my-zsh 中使用的定义。
bash 中也出现同样的问题。 a 中有零宽度序列迅速的需要包含在\[…\]
.
另一种可能性是您的提示符包含非 ASCII 字符,并且 zsh(或任何其他应用程序)和您的终端对它们的宽度有不同的想法。如果有的话,就会发生这种情况编码之间不匹配终端的编码和 shell 中声明的编码不同,这两种编码会导致某些字节序列的宽度不同。通常,当使用非 Unicode 终端但声明 Unicode 区域设置时,您可能会遇到此问题,反之亦然。
应用程序依赖环境变量来了解区域设置;相关设置为,它由环境变量、和LC_CTYPE
确定(设置的第一个适用)。该命令会告诉您当前的设置。通常,避免区域设置问题的最佳方法是让终端仿真器设置,因为它知道它需要什么编码;但如果这不适合您,请务必设置.LANGUAGE
LC_ALL
LC_CTYPE
LANG
locale | grep LC_CTYPE
LC_CTYPE
LC_CTYPE
当上一个命令显示一些不以换行符结尾的输出时,可能会出现相同的症状,因此提示符显示在行的中间,但 shell 没有意识到这一点。在这种情况下,这种情况只会在运行这样的命令后发生,而不是持续发生。
如果某行显示不正确,命令redisplay
或clear-screen
(默认绑定到Ctrl+ )将修复它。L
答案2
我遇到了同样的问题,并在这里找到了我的解决方案:https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519。只需将以下内容放入您的~/.zshrc
.
export LC_CTYPE=en_US.UTF-8
答案3
我在 macOS 上的 iTerm 2 中遇到了这个问题。我最终通过转到“首选项”->“配置文件”->“文本”并勾选“使用 Unicode 版本 9 宽度”来解决该问题。
答案4
我在使用 ubuntu lts docker image ( ) 时遇到了这个问题ubuntu:latest
。我按照相应页面上提供的说明修复了它:https://hub.docker.com/_/ubuntu
apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh