zsh:完整的相对路径作为绝对路径?

zsh:完整的相对路径作为绝对路径?

我正在尝试为命令编写一个完成函数,该命令要求其参数是绝对路径。 (不,我不知道为什么。)我认为允许输入相对路径会很好,但是完成会将其扩展为绝对路径 - 这样,如果我忘记了绝对路径的要求,完成将修复对我来说。例如,如果我的工作目录是 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 "$@";
}

这适用于许多常见情况,包括识别以 和 开头的路径~/(例如绝对路径)以及使用变量表示的路径。我没有考虑与扩展(例如通配符)和嵌入的所有可能的交互。

相关内容