完成后,显示屏中重复显示命令的前几个字符


21

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

在此处输入图片说明

我已经尝试过rxvt-unicdoe,xterm,终止符。所有这些终端仿真器都存在此问题。

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


是在zsh执行的命令中重复字符还是仅显示字符?如果命令长于两个字符,字符数会改变吗?当前目录更改时,数字会更改吗?
吉尔斯(Gillles)“所以别再作恶了”

@Gilles命令中不存在重复的char。我可以执行命令。
吉伦

Answers:


32

如果命令行上的字符有时显示为偏移量,则通常是因为zsh为提示计算了错误的宽度。症状是,只要您添加字符或逐个字符地移动,显示器就会看起来不错,但是当您使用其他移动光标的命令(Home,完成等)时,显示会出现乱码(有些字符显示得比应的更远)。 )或命令与第二行重叠。

Zsh需要知道提示的宽度,以便知道命令字符的位置。除非另有说明,否则假定每个字符都占据一个位置。

一种可能是您的提示包含未正确定界的转义序列。更改文本的颜色或其他格式设置方面或更改窗口标题或其他效果的转义序列的宽度为零。它们必须包含在一个大括号中%{…%}。更一般而言,类似的转义序列%42{…%}告诉zsh假定括号内的内容为42个字符宽。

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

在bash中也会出现相同的问题。提示中的零宽度序列需要用括起来\[…\]

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

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

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

如果一行显示不正确,则命令redisplayclear-screen(默认情况下绑定到Ctrl+ L)将对其进行修复。


我想我可能缺少相关的字体,我注意到第一个字符很奇怪。预计会是->我的想法
jilen 2013年

@jilen Ah,这可能是我忘记提到的另一个问题:也许您的提示包含与终端不同编码的非ASCII字符,其中一种或两种编码均为多字节。如果你想与帮助,后期的输出localeecho $PS1 | od -t x1(同样的事情与使用任何其他变量$PS1)。
吉尔(Gilles)“所以,别再邪恶了”

2
我忘记设置语言环境(我正在使用archlinux,默认情况下未设置语言环境)。设置区域设置后,此问题已解决。非常感谢,伙计!!
吉伦

我支持它,因为它非常棒。但是,如果您自己处理游标,则不必在括号中绝对包含转义符。调用subshel​​led函数在过去对我有用-否则仍可以在/ dev / tty上进行而不涉及stdout的重定向可能会起作用。其他有效的方法- \e{7,8}用于保存/恢复光标状态。
mikeserv

LC_CTYPE为我解决的。我将其设置为C,当我取消设置时,一切正常。谢谢。
jmaloney 2014年


1

我在macOS的iTerm 2中遇到了这个问题。最后,通过转到“首选项”->“配置文件”->“文本”并勾选“使用Unicode版本9的宽度”,解决了该问题。


哇,这确实有效。谢谢!
Paul Calabro

1

我使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.