【问题标题】:Zsh tab completion duplicating command nameZsh tab完成复制命令名称
【发布时间】:2012-08-11 15:50:48
【问题描述】:

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

当使用诸如 homebrew 之类的命令的 tab 补全时,当 ZSH 列出可用命令时,它也是在复制命令。例如:

$ brew {tab}

将导致:

$ brew brew 
[list of homebrew commands]

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

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

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

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

【问题讨论】:

    标签: macos zsh tab-completion zsh-completion


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!我现在明白为什么它不起作用了;将颜色更改为您指定的格式完美地解决了问题。
    • 另外,就像我的情况一样,在提示符中使用 \b 字符做一些花哨的事情会导致位置偏离 2。
    • 看来除了将${fg[color]}颜色包裹在%{%}括号内,还需要将$reset_color包裹在其中。
    • 这个问题也很相关:superuser.com/questions/230301/… 答案给出了正确替换字符的示例。作为一个业余爱好者,它帮助了我。
    【解决方案2】:

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

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

    还加了

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

    到 ~/.profile 可以帮助

    【讨论】:

    • 对我来说就是这样。知道如何在不搞乱行编辑的情况下启用花哨的 unicode 字符吗?
    • 设置 LC_ALL 对我有用,但我必须在 ~/.zshenv 中插入导出指令,因为它不是从 ~/.profile 中提取的
    【解决方案3】:

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

    【讨论】:

    • 天哪,这让我发疯了,因为我忘记了我做了同样的改变。谢谢!
    • 最后,这就是我所缺少的。感谢您提及!
    【解决方案4】:

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

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

    【讨论】:

    • 这为我解决了 OSx Mojave (10.14.6) 和 iTerm2 的问题。
    【解决方案5】:

    很多地方的很多答案都建议使用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]%}✗"
    

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

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

    还有这个

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

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

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

    【讨论】:

      【解决方案6】:

      我使本地和 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 中为我设置语言环境)李>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        相关资源
        最近更新 更多