在 zsh 制表符补全中使用冒号作为文件名分隔符



我有一些程序将文件名参数作为

scp:path/to/file.ext
ark:/abs/path/to/file.ext

是否可以在某些关键字后跟冒号后使zsh完成文件名?

到目前为止,我找到了如何在 bash 中做到这一点:将:添加到COMP_WORDBREAKS变量中。


多亏了吉尔斯,我设法像这样工作。

$ cat ~/.zshrc
...
function aftercolon() {
if compset -P 1 '*:'; then
_files "$expl[@]"
else
_files "$expl[@]"
fi
}
autoload -Uz compinit
compinit
compdef aftercolon hello olleh

现在在命令helloolleh中,完成之后 : 按预期工作。

我认为可能有更好的方法,因为:

  1. 我不得不奇怪如果/否则,因为这些命令也采用不带前缀的文件名。

  2. 由于我有很多命令采用这种参数,我需要添加每个命令的名称

调用compset -P 1 '*:'删除第一个冒号之前的所有内容,然后_files以完成冒号后面的内容。例如,如果文件名完成不依赖于冒号前的部分:

if compset -P 1 '*:'; then
_files "$expl[@]"
else
compadd "$expl[@]" -S : ark scp
fi

如果文件名完成取决于冒号前面的部分,请先保存$PREFIX中的部分。

if [[ $PREFIX = *:* ]]; then
local domain=${PREFIX%%:*}
compset -P 1 '*:'
case $domain in
ark) _files "$expl[@]" -g "*.((tar|cpio)(|.gz|.xz|.bz2)|tgz|zip|rar|7z)";;
*) _files "$expl[@]";;
esac
else
compadd "$expl[@]" -S : ark scp
fi

最新更新