Zsh自动完成功能基于2个参数

agr*_*ann 5 terminal zsh zsh-completion

我有这样的功能:

p() { cd ~/Clients/$1/Projects/$2; }
Run Code Online (Sandbox Code Playgroud)

然后我可以输入:

p "Client here" "Project here"
Run Code Online (Sandbox Code Playgroud)

它需要我:

~/Clients/Client here/Projects/Project here
Run Code Online (Sandbox Code Playgroud)

这里没什么特别的.但是如何为此功能实现自动完成?我设法为第一个参数(客户端)获得自动完成工作:

_p() { _files -W ~/Clients -/; }
compdef _p p
Run Code Online (Sandbox Code Playgroud)

但是如何自动完成第二个参数(项目)呢?它需要从基于客户端的文件夹中自动完成:

~/Clients/$1/Projects
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮忙!:-)

agr*_*ann 8

IRC的一个聪明人(Mikachu)帮助了:

p() { cd ~/Clients/$1/Projects/$2; }
_p() {
  _arguments '1: :->client' '2: :->project'
  case $state in
    client)
      _files -W ~/Clients
    ;;
    project)
      _files -W ~/Clients/$words[CURRENT-1]/Projects
    ;;
  esac 
}
compdef _p p
Run Code Online (Sandbox Code Playgroud)

更新:将 $ words [CURRENT-1]更改为$ {(Q)字[CURRENT-1]},使其适用于包含空格的目录:

p() { cd ~/Clients/$1/Projects/$2; }
_p() {
  _arguments '1: :->client' '2: :->project'
  case $state in
    client)
      _files -W ~/Clients
    ;;
    project)
      _files -W ~/Clients/${(Q)words[CURRENT-1]}/Projects
    ;;
  esac 
}
compdef _p p
Run Code Online (Sandbox Code Playgroud)