【问题标题】:Have zsh return case-insensitive auto-complete matches, but prefer exact matches让 zsh 返回不区分大小写的自动完成匹配,但更喜欢完全匹配
【发布时间】:2014-06-15 04:54:29
【问题描述】:

我正在将 zsh 与 oh-my-zsh 的 rc 文件一起使用,并且有些行为我觉得特别烦人。默认情况下,oh-my-zsh 配置为在自动完成时返回不区分大小写的匹配项。这种行为有时很好,但有时真的很糟糕。有没有办法可以将 zsh 配置为仅在没有区分大小写的匹配时使用不区分大小写的匹配?

例如,这种情况将使用区分大小写的匹配:

> ls
LICENSE.txt    lib/
> emacs l <-- should autocomplete to lib/

在这种情况下,会发生不区分大小写的自动完成:

> ls
README    lib/
> emacs r <-- should autocomplete to README

谢谢!

【问题讨论】:

    标签: zsh oh-my-zsh


    【解决方案1】:

    使用以下行创建一个文件 ~/.oh-my-zsh/custom/better-completion.zsh(假设您使用 oh-my-zsh 的默认路径)

    zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
    

    解释:

    zsh 补全中的匹配规则通常以matcher-list 样式定义。对于 oh-my-zsh,这是在 ~/.oh-my-zsh/lib/completion.zsh 中定义的(一次用于区分大小写,一次用于不区分大小写)。你可以在那里改变它,但如果你更新你的oh-my-zsh,它可能会消失。 ~/.oh-my-zsh/custom 专门用于自定义,扩展名为 .zsh 的文件在配置结束时由 .oh-my-zsh/oh-my-zsh.sh 从那里加载。

    oh-my-zshmatcher-list 的默认(不区分大小写)设置为:

    zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
    

    其中第一个告诉处理大小写可互换。 因为它是第一条规则,所以每次比赛都会使用它。

    唯一需要做的改变是在''前面加上简单的补全(它甚至是zshcompsys(1)matcher-list的第一个例子)

    zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
    

    在尝试不区分大小写或其他匹配之前,首先尝试完全按照其书写的方式完成当前单词。

    要完整:

    • 第二条(原始)规则允许在 ._- 之前部分完成,例如f.b -> foo.bar.
    • 第三条规则允许在书写文本的左侧完成,例如bar -> foobar)

    【讨论】:

    • 您还必须将 CASE_SENSITIVE 设置为 true 我假设?
    • 谢谢@didibus。我删除了if 子句,所以CASE_SENSITIVE 的设置不再重要。我不确定我当时在想什么。 oh-my-zsh 自身的行为依赖于CASE_SENSITIVE,但由于我们想以任何一种方式对其进行更改,甚至检查原始设置都没有意义。
    • 你在':completion:*'之后忘记了matcher-list,不是吗?
    • @neoascetic 是的,我做到了。谢谢,我已经修好了。
    • @inherithandle 只要您的~/.zshrc 没有获取oh-my-zsh.sh(通常位于~/.oh-my-zsh/oh-my-zsh.sh),您很可能不会使用Oh My Zsh。当然,这并不一定意味着您使用的是“普通”zsh,因为周围还有其他框架。在大多数情况下,我会说您没有使用 Oh My Zsh (或其他框架),除非您自己安装它。如果你忘记了或者它不是你自己的机器,唯一确定的方法是检查所有 zsh 配置文件(在你的 $HOME 以及 /etc/etc/zsh 中)。跨度>
    【解决方案2】:

    只需取消注释 ~/.zshrc 中的以下行:

    # Uncomment the following line to use case-sensitive completion.
    # CASE_SENSITIVE="true"
    

    它对我有用

    【讨论】:

    【解决方案3】:

    不使用oh-my-zsh的可以在~/.zshrc中添加以下两行

    zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
    autoload -Uz compinit && compinit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 2020-07-06
      • 2019-10-03
      相关资源
      最近更新 更多