zsh标签自动完成会破坏命令行格式

9
我在Mac OS X上使用oh-my-zsh和zsh。每次使用zsh的智能补全时,当前命令行提示符的格式都会出现问题。例如:
我将输入“cd fo”,并尝试通过Tab键自动完成“foo”目录。zsh提示进行自动完成,但在等待我完成之前,它将命令行更改为“cd fo cd fo”。虽然这不是什么大问题,但非常烦人。有什么建议吗?

1
你的提示符有颜色高亮吗?如果你没有以正确的方式使用转义序列,那么shell会对它所占用的空间感到困惑,并且在完成时重新绘制命令行时会出现混乱。 - Barmar
3
请参考这个答案或者这个问题。如果您需要更多帮助,请发出您的~/.zshrc或其他适用文件的内容。 - simont
3个回答

8
我在PopOS和Arch Linux上遇到了同样的问题。我尝试了来自各个地方的许多解决方案,但唯一有效的解决方案是romkatv在oh-my-zsh Github存储库上的问题中提出的this建议。
解决方案是复制你在oh-my-zsh中使用的任何主题的.zsh-theme文件,并用%{%G<CHARACTER>%}包围所有非ASCII字符(如表情符号)。
例如,默认的oh-my-zsh主题robbyrussel包含两个非ASCII字符。提示中的'➜'字符。
PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"

在git目录提示符中,'✗'字符代表不干净状态。
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"

使用%{%G<character>%}来包裹这两个非ASCII字符,就像这样

PROMPT="%(?:%{$fg_bold[green]%}%{%G➜%} :%{$fg_bold[red]%}%{%G➜%} )"

和这个

ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}%{%G✗%}"

问题已解决。


3

我之前也遇到过同样的问题,我的解决方案是禁用一些zsh插件。第二种可能性是你的颜色主题可能存在一个导致这个问题的错误。

# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(git)

这是我在~/.zshrc文件中插件部分的最终版本。任何其他在括号中的插件可能是你遇到问题的原因。
如果你的问题仍然存在,你需要发布你的~/.zshrc文件以让我们检查其中的内容。

2

我曾经遇到过同样的问题。有趣的是,我只在iterm2中看到了这个问题,而在OS X标准终端中(在反向搜索/选项卡完成后)提示符正确显示。原因似乎是iterm2默认使用Unicode(UTF-8)编码,但如果未在shell中设置相应的语言变量,则无法正确解释。

解决方案:将以下内容添加到您的.zshrc文件中

export LC_ALL=en_US.UTF-8

提示将会正确显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接