我在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上遇到同样问题的人。但是,我不理解给定的解决方案,我甚至不确定它是否适用于我的设置?
答案 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的答案:
export LANG=en_US.UTF-8
(只需在模板中取消注释该部分.zshrc;导出LC_ALL
,如@ neotohin的回答,而不是LANG
也可以,我没试过) 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字符,如上所示,希望您再也不会遇到重复问题。