让zsh返回不区分大小写的自动完成匹配,但更喜欢完全匹配

时间:2014-06-15 04:54:30

标签: zsh oh-my-zsh

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

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

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:27)

使用以下行创建文件~/.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-zsh matcher-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 - &gt; bar
  • 第三条规则允许在书面文本的左侧填写,例如: foobar - &gt; {{1}})

答案 1 :(得分:24)

取消注释〜/ .zshrc中的以下行:

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

它对我有用

答案 2 :(得分:0)

对我来说最好的解决方案是通过.zshrc配置文件更改设置:

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