我有一個名為 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#*»}"
但如果知道如何正確地做到這一點那就太好了。