更新:

更新:

我有zsh completion我的自定义脚本。它需要 3 个可选参数--insert, --edit--rm并完成给定路径中的文件:

#compdef pass

_pass() {

  local -a args

  args+=(
    '--insert[Create a new password entry]'
    '--edit[Edit a password entry]'
    '--rm[Delete a password entry]'
  )

  _arguments $args '1: :->directory'

  case $state in
  directory)
    _path_files -W $HOME/passwords -g '*(/)' -S /
    _path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
    ;;
  esac
}

我需要添加另一个选项-P,该选项也将提供完成(当我键入-和 时TAB),但不提供路径完成。此选项应该只接受一个字符串。因此它不应该匹配路径,并且如果-P已指定,它也不应该提供其他选项。

如何将此新选项添加​​到我的完成脚本中?

更新:

完成不适用于 option -P,即当我这样做时:

pass -P <TAB>

它什么也没完成,因为选项 -P 需要一个字符串。这很好。但是,当我这样做时

pass -P foo <TAB> 

它也没有完成任何事情。但它应该完成当前路径中的目录。怎样才能做到这一点呢?

答案1

假设您提到的所有选项都是互斥的,那么解决方案如下:

#compdef pass

_pass() {
  local -a args=(
      # (-) makes an option mutually exclusive with all other options. 
      '(-)--insert[Create a new password entry]'
      '(-)--edit[Edit a password entry]'
      '(-)--rm[Delete a password entry]'
      '(-)-P:string:'
      '1:password entry:->directory'
  )

  _arguments $args

  case $state in
    directory)
      _path_files -W $HOME/passwords -g '*(/)' -S /
      _path_files -W $HOME/passwords -g '*.gpg(:r)' -S ' '
      ;;
  esac
}

文档在这里:http://zsh.sourceforge.net/Doc/Release/Completion-System.html#index-_005farguments

相关内容