具有zsh返回不区分大小写的自动完成匹配,但更喜欢精确匹配

具有zsh返回不区分大小写的自动完成匹配,但更喜欢精确匹配,zsh,oh-my-zsh,Zsh,Oh My Zsh,我将zsh与我的zsh的rc文件一起使用,我发现有一些行为特别烦人。默认情况下,oh my zsh配置为在自动完成时返回不区分大小写的匹配项。这种行为有时是好的,但有时真的很糟糕。当没有区分大小写的匹配时,是否有一种方法可以将zsh配置为仅在静态匹配中使用case 例如,本例将使用区分大小写的匹配: > ls LICENSE.txt lib/ > emacs l <-- should autocomplete to lib/ >ls LICENSE.txt库/ >ema

我将zsh与我的zsh的rc文件一起使用,我发现有一些行为特别烦人。默认情况下,oh my zsh配置为在自动完成时返回不区分大小写的匹配项。这种行为有时是好的,但有时真的很糟糕。当没有区分大小写的匹配时,是否有一种方法可以将zsh配置为仅在静态匹配中使用case

例如,本例将使用区分大小写的匹配:

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

>emacs r创建一个文件
~/.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 completion中的匹配规则通常在
匹配器列表中定义。对于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中匹配器列表的默认设置(不区分大小写)为:

第一个命令告诉我们如何处理上下两个可以互换的大小写。 因为这是第一条规则,所以每场比赛都会使用它

所需的唯一更改是预先添加
'
以实现简单的完成(这甚至是
zshcompsys(1)
匹配器列表的第一个示例)

在尝试不区分大小写或其他匹配之前,这会首先尝试完全按照所写内容完成当前单词

待完成:

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

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

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

这对我很有效

我想你也必须将区分大小写设置为true?谢谢@dibibus。我删除了
if
-子句,因此
区分大小写的设置不再重要。我不确定当时我在想什么。哦,我的zsh自己的行为取决于区分大小写,但由于我们想改变它,甚至检查原始设置都没有意义。你在
之后忘记了匹配列表:完成:“
,不是吗?@neoascetic是的,我忘记了。谢谢,我现在已经修好了。@只要你的
~/.zshrc
没有源代码
oh my zsh.sh
(通常放在
~/.oh my zsh/oh my zsh.sh
),你很可能没有使用oh my zsh。当然,这并不一定意味着您使用的是“普通”zsh,因为还有其他框架。在大多数情况下,我会说,除非您自己安装,否则您不会使用Oh My Zsh(或其他框架)。如果您忘记了或它不是您自己的机器,唯一可以绝对确定的方法是检查任何和所有zsh配置文件(在您的
$HOME
以及
/etc
/etc/zsh
中)。这只适用于Oh My zsh。编辑:哦,是关于我的天啊。。。但这个答案并不能完全满足需求。
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"