ZSH补全匹配控制:实现资源路由的模糊匹配需求
ZSH资源路由补全:实现包含匹配或忽略最后段的方案
方案一:自定义匹配规则实现子串匹配
ZSH的_multi_parts支持通过-M参数传递匹配规则给compadd,要实现最后一段的包含匹配,只需设置允许子串匹配的规则:
_multi_parts '/' -M 'r:|=* r:[/]=*' "$(mycmd /some/resource/id)"
r:|=*:允许输入的片段作为子串出现在候选的对应分段中,而非仅前缀匹配r:[/]=*:确保路径分割符/的处理逻辑正确,不干扰其他分段的匹配
这样当你输入/resource/identifier/bc时,会匹配到最后一段包含bc的候选(如/resource/identifier/abc456/、/resource/identifier/123abcXYZ/)。
方案二:忽略最后一段标识符补全
如果不需要匹配最后一段,直接补全当前路径下的所有子资源,可以先截断输入路径的最后一段,再调用mycmd:
# 提取当前输入路径,去掉最后一段 local current_path="${words[CURRENT]%/*}" # 处理根路径的特殊情况(如输入"/bc"时,截断后为空,需重置为"/") [[ -z "$current_path" ]] && current_path="/" # 生成补全候选 _multi_parts '/' "$(mycmd "$current_path")"
通过${words[CURRENT]%/*}参数展开截断最后一段路径,用处理后的路径调用mycmd,即可获取当前路径下的所有子资源补全项。
调试提示
- 用
zsh -x运行脚本,查看补全过程中的变量值和命令执行细节,便于排查问题 - 如果
mycmd返回的候选末尾带/,可先用sed 's/\/$//'清理后再传递给_multi_parts
内容的提问来源于stack exchange,提问作者lsdch
相关产品推荐
相关产品推荐

