5

我有这样的功能:

p() { cd ~/Clients/$1/Projects/$2; }

然后我可以输入:

p "Client here" "Project here"

它需要我:

~/Clients/Client here/Projects/Project here

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

_p() { _files -W ~/Clients -/; }
compdef _p p

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

~/Clients/$1/Projects

希望有人能帮忙!:-)

4

1 回答 1

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

更新:将 $words[CURRENT-1] 更改为 ${(Q)words[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
于 2012-05-22T10:46:22.793 回答