我有一个名为 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
检查匹配完成时与模式匹配的任何内容。?
匹配任意一个字符。- 如果
X
或Y
等于*
,则匹配任意数量的连续字符。 - 如果
Z
equals*
,则匹配任意数量的连续字符除了与 匹配的任何内容Y
。 - 如果
Z
equals**
,则匹配任意数量的连续字符。 - 在 中
r:|?=**
,X
等于空字符串。 - 默认情况下,Zsh 已经在输入的末尾添加了一个通配符,从而完成了完全模糊匹配的循环。
您可以在这里找到文档:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control
答案2
当我等待更明智的答案时,这是黑客行为......
我所做的就是让我的建议生成器产生如下建议:
hw»oh hello there, world
因为命令(实际上是一个函数)在我的控制范围内,所以我简单地从一开始就把垃圾去掉:
input="${input#*»}"
但如果知道如何正确地做到这一点那就太好了。