Zsh tab 完成复制命令名称

问题描述 投票:0回答:6

我使用的是 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上遇到同样的问题。但是,我不明白给定的解决方案,我什至不确定它是否适用于我的设置?

macos zsh tab-completion zsh-completion
6个回答
36
投票

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

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

还补充

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

~/.profile can help


31
投票

问题可能是由于放错位置的

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

它们的问题在于,无法用“嘿,我输出了一些文本”之类的问题来查询终端。光标现在在哪里?” zsh 必须自己计算提示符的长度。当您键入一些文本并要求 zsh 完成时,zsh 会说终端将光标移动到特定位置并在那里键入完成的 cmdline。由于

%{%}
括号放错了位置,所以这个特定位置是错误的。


13
投票

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


12
投票

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

设置

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


9
投票

很多地方的很多答案都提出了

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

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

事实证明,至少在我的情况下,只有当行中某处存在非 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]%}%{%G➜%} :%{$fg_bold[red]%}%{%G➜%} )"

还有这个

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

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

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


0
投票

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

  1. 设置
    export LANG=en_US.UTF-8
    (只需取消注释模板.zshrc中的该部分即可;导出
    LC_ALL
    ,如@neotohin的回答所示,而不是
    LANG
    也可以工作,我没有尝试)
  2. 取消选中终端配置文件的“高级”部分中的“启动时设置区域设置环境变量”(原因:该设置设置
    LC_CTYPE=UTF-8
    而不是
    en_US.UTF-8
    ,这会在 ssh 中阻止我的区域设置)
© www.soinside.com 2019 - 2024. All rights reserved.