zsh 补全格式为 --host=hostname

zsh 补全格式为 --host=hostname

我有一个自定义脚本,需要一个 形式的参数--host=hostname,并允许一个可选参数-n, --dry-run

我已经创建了zsh完成,其中提供了可选参数:

#compdef sync-data.sh

_sync-data.sh () {
  local -a args

  args+=(
    '(-n --dry-run)'{-n,--dry-run}'[show what would have been transferred]'
  )

  _arguments $args && return
}

_sync-data.sh "$@"

但我如何添加必需的--host=hostname,以便:

  1. 它作为第一个参数完成
  2. 之后的部分=是根据我的_hosts完成情况完成的
  3. --dry-run--host=仅在提供所需选项后才提供完成
  4. --host=hostname提供after ,并且可选地--dry-run,不提供其他补全(即,没有本地文件名)。

答案1

1+2) 将如下内容作为参数添加到 _arguments 中:

    '--host=[specify host]:host:_hosts'

方括号中的部分是可能需要改进的描述。

  1. 使添加--dry-run成为args条件。(( CURRENT > 2 ))从第二个单词开始添加。检查命令行上(( $words[(I)--host*] ))是否存在。--host这取决于什么是合适的。

  2. 这应该是默认情况。

您的函数中添加了一些多余的元素。无需将 a 定义_sync-data.sh为文件的全部内容,然后调用它。仅当您从一个函数定义多个函数时,这才有用。自动加载函数已经是一个函数了。而且,这&& return是多余的。函数传递最后一个命令的返回状态。

根据评论请求的整个代码:

#compdef sync-data.sh

local -a args

(( $words[(I)--host*] )) && args+=(
  '(-n --dry-run)'{-n,--dry-run}'[show what would have been transferred]'
)

_arguments $args \
  '--host=[specify host]:host:_hosts'

相关内容