Zsh选项卡完成重复命令名称

Jam*_*mie 23 macos zsh tab-completion zsh-completion

我在OS X Mountain Lion上运行包含的ZSH shell(4.3.11),并在顶部安装了Oh-My-ZSH.

当使用诸如homebrew之类的命令使用制表符完成时,当ZSH列出可用命令时,它也复制命令.例如:

$ brew {tab}
Run Code Online (Sandbox Code Playgroud)

将导致:

$ brew brew 
[list of homebrew commands]
Run Code Online (Sandbox Code Playgroud)

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

如果我在显示重复项时按下退格键,我只能删除命令的第二个实例,zsh不会让我再退格.此外,如果我使用退格键删除副本,则zsh就像没有输入任何命令一样.

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

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

ZyX*_*ZyX 27

问题很可能是由于错误的%{ %}括号告诉zsh内部文本的宽度为零.应该包含的唯一内容是转义序列,它们会改变文本的颜色或粗体.如果您使用的是新的zsh(> = 4.3.{unknown version}),我甚至建议您使用,而不是使用%F{color}...%f,或者您拥有它.%K{color}...%k%B...%b%{${fg[green]}%}

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


Max*_*pov 21

如果您使用任何花哨的UTF-8字符,如箭头,"git branch"字符等,也可以重现此效果.

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

还添加

export LC_ALL = en_US.UTF-8
export LANG = en_US.UTF-8

到〜/ .profile可以提供帮助


Mar*_*yeb 10

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


Geo*_*.M. 9

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

\n\n

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

\n\n

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

\n\n

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

\n\n

例如,默认的 oh-my-zsh 主题robbyrussel包含 2 个非 ASCII 字符。提示符中的 \'\xe2\x9e\x9c\' 字符

\n\n
PROMPT="%(?:%{$fg_bold[green]%}\xe2\x9e\x9c :%{$fg_bold[red]%}\xe2\x9e\x9c )"\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及 git 目录提示中的 \'\xe2\x9c\x97\' 字符

\n\n
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}\xe2\x9c\x97"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
PROMPT="%(?:%{$fg_bold[green]%}%{%G\xe2\x9e\x9c%} :%{$fg_bold[red]%}%{%G\xe2\x9e\x9c%} )"\n
Run Code Online (Sandbox Code Playgroud)\n\n

和这个

\n\n
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}%{%G\xe2\x9c\x97%}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这最终为我解决了问题。

\n\n

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

\n


小智 8

这是一个老线程但我在zsh设置中遇到类似的问题与oh-my-zsh配置.

设置export LC_ALL=en_US.UTF-8修复了问题.