如何配置 zsh 来完成部分单词,但不区分大小写?

sha*_*ahn 2 zsh zshrc zsh-completion

目前我的~/.zshrc

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

AFAIU'm:{a-z}={A-Za-z}'意味着我将获得不区分大小写的制表符完成,例如foo将制表符完成到Foobar(如果存在)。并且'r:|[._-]=* r:|=*' 'l:|=* r:|=*'意味着我将获得单词后面部分的匹配项,例如bar将制表符补全到foobar(如果存在)。但这些部分匹配并非不区分大小写。因此,例如bar,不会使用制表符完成FooBar(再次,如果存在的话)。

有办法让它发挥作用吗?

Mar*_*ert 6

你的匹配器matcher-list总是一次尝试一个,直到其中之一返回至少一场匹配。默认情况下,每个匹配器都会完全替换前一个匹配器。要使下一个匹配器包含前一个匹配器,您需要在其前面加上前缀+

\n
zstyle \':completion:*\' matcher-list \\\n    \'m:{[:lower:]}={[:upper:]}\' \\\n    \'+r:|[._-]=* r:|=*\' \\\n    \'+l:|=*\'\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅matcher-list完成样式文档。

\n
\n
\n

并且\'r:|[._-]=* r:|=*\' \'l:|=* r:|=*\'意味着我将获得单词后面部分的匹配项,例如bar将制表符补全到foobar(如果存在)。

\n
\n

不完全是:

\n
    \n
  • 如果<word>命令行上的字符串是 \xe2\x80\x99s 正在完成,那么默认情况下,Zsh 将返回与glob 模式 <word>*\xe2\x80\x94 匹配的完成,除非COMPLETE_IN_WORD设置了,在这种情况下它将创建一个完成模式通过*在光标位置插入来代替。
  • \n
  • r:|[._-]=*表示 \xe2\x80\x9c 对于<word>空字符串中的每次出现,后跟右侧 ( r) 的._或,在补全模式中在它们之间-插入( )。\xe2\x80\x9d*|
  • \n
  • r:|=*表示 \xe2\x80\x9c如果<word>在右侧以空字符串结尾(始终为真),请在完成模式后缀*.\xe2\x80\x9d
  • \n
  • l:|=*表示 \xe2\x80\x9c 如果<word>在左侧以空字符串开头(始终为 true),则在完成模式前添加*.\xe2\x80\x9d
  • \n
  • 在父完成模式中的同一索引处插入的多个子模式通过逻辑 OR 组合。
  • \n
\n

请参阅完成匹配控制文档以获取更深入的解释。

\n