Answers:
如果命令行上的字符有时显示为偏移量,则通常是因为zsh为提示计算了错误的宽度。症状是,只要您添加字符或逐个字符地移动,显示器就会看起来不错,但是当您使用其他移动光标的命令(Home,完成等)时,显示会出现乱码(有些字符显示得比应的更远)。 )或命令与第二行重叠。
Zsh需要知道提示的宽度,以便知道命令字符的位置。除非另有说明,否则假定每个字符都占据一个位置。
一种可能是您的提示包含未正确定界的转义序列。更改文本的颜色或其他格式设置方面或更改窗口标题或其他效果的转义序列的宽度为零。它们必须包含在一个大括号中%{…%}
。更一般而言,类似的转义序列%42{…%}
告诉zsh假定括号内的内容为42个字符宽。
因此,请检查您的提示设置(PS1
,PROMPT
或它们引用的变量),并确保所有转义序列(例如\e[…m
更改文本属性,请注意,它们可能通过某些变量如$fg[red]
)出现在内部%{…%}
。由于您使用的是oh-my-zsh,因此请同时检查您自己的设置和从oh-my-zsh使用的定义。
在bash中也会出现相同的问题。提示中的零宽度序列需要用括起来\[…\]
。
另一种可能是您的提示包含非ASCII字符,并且zsh(或任何其他应用程序)和终端对它们的宽度有不同的想法。如果终端的编码与外壳程序中声明的编码不匹配,并且两种编码导致某些字节序列的宽度不同,则可能发生这种情况。通常,在使用非Unicode终端但声明Unicode语言环境时可能会遇到此问题,反之亦然。
应用程序依赖于环境变量来了解语言环境。相关设置是LC_CTYPE
,它是从环境变量确定LANGUAGE
,LC_ALL
,LC_CTYPE
和LANG
(这些在第一即组内)。该命令locale | grep LC_CTYPE
告诉您当前的设置。通常,避免区域设置问题的最佳方法是设置终端仿真器LC_CTYPE
,因为它知道期望的编码。但是,如果这对您不起作用,请确保设置LC_CTYPE
。
当上一个命令显示的输出未以换行符结尾时,可能会出现相同的症状,因此提示符显示在该行的中间,但Shell并没有意识到这一点。在这种情况下,只有在运行这样的命令后才会发生,而不会持续发生。
如果一行显示不正确,则命令redisplay
或clear-screen
(默认情况下绑定到Ctrl+ L)将对其进行修复。
->
我的想法
locale
和echo $PS1 | od -t x1
(同样的事情与使用任何其他变量$PS1
)。
\e{7,8}
用于保存/恢复光标状态。
LC_CTYPE
为我解决的。我将其设置为C
,当我取消设置时,一切正常。谢谢。
我在macOS的iTerm 2中遇到了这个问题。最后,通过转到“首选项”->“配置文件”->“文本”并勾选“使用Unicode版本9的宽度”,解决了该问题。
我使用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