在zsh选项卡完成中使用冒号作为文件名分隔符

时间:2018-05-23 12:36:56

标签: autocomplete zsh

我有将文件名参数作为

的程序
scp:path/to/file.ext
ark:/abs/path/to/file.ext

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

到目前为止,我发现了如何在bash中执行此操作:将:添加到COMP_WORDBREAKS变量。

感谢Gilles,我设法像这样工作。

$ 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. 我不得不奇怪if / else,因为这些命令也带有没有前缀的文件名。

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

1 个答案:

答案 0 :(得分:1)

调用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
相关问题