Función de autocompletar Zsh basada en 2 argumentos

Tengo una función como esta:

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

Entonces puedo escribir:

p "Client here" "Project here"

y me lleva a:

~/Clients/Client here/Projects/Project here

Aquí no pasa nada especial. Pero, ¿cómo implemento autocompletar para esta función? Logré obtener el trabajo de autocompletado para el primer argumento (clientes):

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

Pero, ¿cómo autocompletar el segundo argumento (proyectos)? Debe autocompletarse desde la carpeta según el cliente:

~/Clients/$1/Projects

¡Espero que alguien pueda ayudar! :-)

preguntado el 22 de mayo de 12 a las 11:05

1 Respuestas

Una persona inteligente (Mikachu) en IRC ayudó:

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

ACTUALIZACIÓN: Cambie $words[CURRENT-1] a ${(Q)words[CURRENT-1]} para que funcione con directorios que contengan espacios:

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

contestado el 22 de mayo de 12 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.