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

时间:2012-08-11 15:50:48

标签: macos zsh tab-completion zsh-completion

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

当使用自制程序等命令使用制表符完成时,当ZSH列出可用命令时,它也会复制命令。例如:

$ brew {tab}

将导致:

$ brew brew 
[list of homebrew commands]

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

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

我的.zshrc以及我的所有其他。配置文件都可以在https://github.com/daviesjamie/dotfiles

找到

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

6 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:21)

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

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

同时添加

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

to~ / .profile可以提供帮助

答案 2 :(得分:9)

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:0)

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

  1. 设置export LANG=en_US.UTF-8(只需在模板中取消注释该部分.zshrc;导出LC_ALL,如@ neotohin的回答,而不是LANG也可以,我没试过)
  2. 在终端配置文件的“高级”部分中
  3. 取消选中“在启动时设置区域设置环境变量”(原因:该设置设置LC_CTYPE=UTF-8而不是en_US.UTF-8,这会制动区域设置对于我在ssh)

答案 5 :(得分:0)

许多地方的许多答案都提出了export LC_ALL=en_US.UTF-8解决方案。但是,这对我不起作用。在Arch Linux和PopOS上,我仍然使用oh-my-zsh遇到此问题。

唯一适用于我的解决方案是romkatv提出的this site关于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]%}✗"

在这样的2个非ASCII字符周围使用%{%G<character>%}

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

还有这个

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

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

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