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

Max*_*Max 29 zsh oh-my-zsh

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

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

> ls
LICENSE.txt    lib/
> emacs l <-- should autocomplete to lib/
Run Code Online (Sandbox Code Playgroud)

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

> ls
README    lib/
> emacs r <-- should autocomplete to README
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ahm*_*any 42

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

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
autoload -Uz compinit && compinit
Run Code Online (Sandbox Code Playgroud)


Ada*_*hon 30

~/.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:|=*'
Run Code Online (Sandbox Code Playgroud)

说明:

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.

默认情况下(不区分大小写)用于设置matcher-listOH-MY-zsh的是:

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Run Code Online (Sandbox Code Playgroud)

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

所需的唯一改变是前面加上''为简单的完成(它甚至在第一个例子中zshcompsys(1)matcher-list)

zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Run Code Online (Sandbox Code Playgroud)

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

完成:

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

  • 我还假设您还必须将CASE_SENSITIVE设置为true? (2认同)

小智 29

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

# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"
Run Code Online (Sandbox Code Playgroud)

它对我有用

  • 这仅适用于Oh My Zsh。https://github.com/robbyrussell/oh-my-zsh/blob/master/lib/completion.zsh编辑:糟糕,这是关于Oh My Zsh ...但是这个答案不能完全满足需求。 (2认同)