52

我正在将 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

谢谢!

4

3 回答 3

49

使用以下行创建一个文件~/.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)for中的第一个示例matcher-list

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

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

要完整:

  • 第二条(原始)规则允许在或之前部分完成.,例如-> 。_-f.bfoo.bar
  • 第三条规则允许在书面文本的左侧完成,例如bar-> foobar)
于 2014-06-16T06:15:31.437 回答
45

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

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

它对我有用

于 2015-01-19T09:45:10.763 回答
16

对于那些不使用 oh-my-zsh 的人,您可以添加以下两行到~/.zshrc

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
autoload -Uz compinit && compinit
于 2021-09-01T13:42:29.280 回答