27

我在 OS X Mountain Lion 上,运行附带的 ZSH shell (4.3.11),顶部安装了 Oh-My-ZSH。

当对 homebrew 等命令使用制表符补全时,当 ZSH 列出可用命令时,它也是在复制命令。例如:

$ brew {tab}

将导致:

$ brew brew 
[list of homebrew commands]

我不确定是什么导致了这个错误,因为当我调整终端窗口的大小时,命令名称的第一个实例消失了。

如果在显示重复项时按退格键,我只能删除该命令的第二个实例,zsh 不会再让我退格。另外,如果我确实使用退格键删除了重复项,zsh 就好像根本没有键入命令一样。

我的 .zshrc 以及所有其他 .configuration 文件可以在https://github.com/daviesjamie/dotfiles找到

更新:我发现这篇文章是关于有人在 Ubuntu 上遇到同样问题的。但是,我不理解给定的解决方案,我什至不确定它是否适用于我的设置?

4

6 回答 6

31

如果您使用任何花哨的 UTF-8 字符(如箭头、“git 分支”字符等),也可以重现此效果。

只需从提示中删除此字符,就不会发生重复。

还添加

导出 LC_ALL=en_US.UTF-8
导出 LANG=en_US.UTF-8

到 ~/.profile 可以提供帮助

于 2014-04-01T07:32:15.037 回答
30

这个问题很可能是由错误的括号引起的,%{ %}这些括号告诉 zsh 里面的文本宽度为零。唯一应该包含在其中的是改变文本颜色或粗体的转义序列。如果您使用的是新的 zsh (>=4.3.{unknown version}),我什至建议使用%F{color}...%f, %K{color}...%k,%B...%b而不是%{${fg[green]}%}或您那里拥有的东西。

他们的问题是没有办法用诸如“嘿,我输出了一些文本”之类的问题来查询终端。光标现在在哪里?” zsh 必须自己计算其提示的长度。当您输入一些文本并要求 zsh 完成时,zsh 会说终端将光标移动到特定位置并在那里输入完成的 cmdline。对于错位%{%}的括号,这个特定的位置是错误的。

于 2012-08-11T18:27:24.267 回答
12

如果您在 Mac 上使用 iTerm,请务必在您的配置文件首选项中选中“自动设置区域设置变量”。我没有检查 SSH 连接,它导致了同样的错误,我通过保留该选项来修复它。

于 2015-04-06T13:05:36.080 回答
11

这是一个旧线程,但我在使用 oh-my-zsh 配置的 zsh 设置中遇到了类似的问题。

设置export LC_ALL=en_US.UTF-8解决了这个问题。

于 2014-07-01T11:30:58.280 回答
5

很多地方的很多答案都提出了export LC_ALL=en_US.UTF-8解决方案。然而,这对我不起作用。我继续在 Arch linux 和 PopOS 上使用 oh-my-zsh 遇到这个问题。

对我有用的唯一解决方案是romkatv关于 oh-my-zsh github 存储库上的一个问题的建议。

事实证明,至少在我的情况下,自动完成重复问题只会在行的某处存在非 ASCII 字符(如表情符号)时出现。ZSH 会错误地假设这个非 ASCII 字符需要占用 2 个字符空间而不是 1 个。

因此,有效的解决方案是打开.zsh-theme您正在使用的任何主题的文件,找到所有非 ASCII 字符并用于%{%G%}告诉 ZSH 对该字符仅使用一个字符宽度

例如,默认的 oh-my-zsh 主题robbyrussel包含 2 个非 ASCII 字符。提示符中的“➜”字符

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

以及 git 目录提示中的“✗”字符

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

像这样使用%{%G<character>%}大约 2 个非 ASCII 字符

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

和这个

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

最终为我解决了这个问题。

因此,您需要做的就是复制您要使用的主题文件并编辑所有非 ASCII 字符,如上所示,希望您再也不会看到重复问题。

于 2019-10-02T06:52:33.100 回答
0

我使本地和 ssh 工作的解决方案类似于@Marc 和@neotohin 答案的组合:

  1. 设置export LANG=en_US.UTF-8(只需取消注释模板 .zshrc 中的该部分; exporting LC_ALL,如@neotohin 的回答,而不是LANG也可以工作,我没有尝试)
  2. 在终端配置文件的“高级”部分中取消选中LC_CTYPE=UTF-8“启动时设置语言环境变量”(原因:该设置设置而不是en_US.UTF-8,这会在 ssh 中为我制动语言环境)
于 2017-04-20T07:45:53.207 回答