我正在尝试为命令编写一个完成函数,该命令要求其参数是绝对路径。 (不,我不知道为什么。)我认为允许输入相对路径会很好,但是完成会将其扩展为绝对路径 - 这样,如果我忘记了绝对路径的要求,完成将修复对我来说。例如,如果我的工作目录是 home 并且我有一个文件“foo”并且我输入fo<TAB>
,它将完成 to/usr/me/foo
而不是foo
像_files
那样。
问题是,我不知道该怎么做。我已经浏览了_files
和上的所有标志compadd
,但没有任何内容听起来相关。 _canonical_paths
听起来很接近,但我无法让它做任何事情。一旦参数是绝对路径,_files
就可以正常工作;问题就出在这第一步。建议?
答案1
以下函数$PWD/
在将其传递给之前添加到任何相对路径_files
,这是文件的正常完成函数。
_absolute_files () {
local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion}
if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then
PREFIX="\$PWD/$PREFIX"
fi
_files "$@";
}
这适用于许多常见情况,包括识别以 和 开头的路径~/
(例如绝对路径)以及使用变量表示的路径。我没有考虑与扩展(例如通配符)和嵌入的所有可能的交互。