如何在 zsh 补全中提供与前缀不匹配的自动补全建议

如何在 zsh 补全中提供与前缀不匹配的自动补全建议

我有一个名为 zsh 自动完成功能的命令,gd它根据$words[CURRENT]值和返回建议进行模糊搜索。搜索工作正常,但 zsh 不显示任何候选内容,因为输入的文本不是建议的前缀。

例如

% gd hw

可能会生成完成oh hello there, world

但 zsh 不会显示这一点,因为hw在建议的开头没有找到 。

我可以让 zsh 提供建议,以在选择时替换当前单词吗?

_gd这是我的完成脚本的简化版本,位于 my 中名为的文件中fpath

#compdef gd

_gd() {
  local -a list

  clue="$words[CURRENT]"

      pattern=""
      for i in $(seq $#clue)
      do
        pattern="$pattern.*${clue[i]}"
      done
      while read dir
      do
        list=( $list $dir )
      done <<<$(grep "$pattern" ~/.recent-dirs)

  _describe gd list
}

答案1

删除该_gd函数并将以下内容添加到您的.zshrc文件中:

autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'

这告诉完成代码允许在您键入的内容之间和周围添加任意数量的附加内容。有了这个,Zsh现在可以模糊完成任何事物

  • r:X|Y=Z查找与模式匹配的所有非重叠子字符串XY,并使之成为匹配的部分X Z检查匹配完成时与模式匹配的任何内容。
  • ?匹配任意一个字符。
  • 如果XY等于*,则匹配任意数量的连续字符。
  • 如果Zequals *,则匹配任意数量的连续字符除了与 匹配的任何内容Y
  • 如果Zequals **,则匹配任意数量的连续字符。
  • 在 中r:|?=**X等于空字符串。
  • 默认情况下,Zsh 已经在输入的末尾添加了一个通配符,从而完成了完全模糊匹配的循环。

您可以在这里找到文档:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control

答案2

当我等待更明智的答案时,这是黑客行为......

我所做的就是让我的建议生成器产生如下建议:

hw»oh hello there, world

因为命令(实际上是一个函数)在我的控制范围内,所以我简单地从一开始就把垃圾去掉:

input="${input#*»}"

但如果知道如何正确地做到这一点那就太好了。

相关内容