sshpass 的 zsh 补全

sshpass 的 zsh 补全

我正在使用sshpass这样的命令:

sshpass -p 'my_password' ssh user@server

根据手册页,完整的语法是

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

目前,zsh 没有任何补全规则sshpass。如何创建简单的完成规则,以便一旦到达“命令”和“参数”,命令的 ssh 就完成,并且 user@host 的完成与标准 ssh 的完成相同?

答案1

您可以从具有类似语法的命令中获取灵感,例如sudo它还接受选项,后跟命令名称及其选项。也可以看看自定义命令的动态 zsh 自动完成有关编写 zsh 补全的介绍。

将以下代码放入_sshpass名为$fpath. (看如何正确地使自定义 zsh 完成“正常工作”?有关 zsh 如何选择补全功能的更多详细信息。)

#compdef sshpass

_sshpass () {
  local context state line
  typeset -A opt_args

  _arguments \
    '(-d -e -f -p)-d+[read password from file descriptor]:file descriptor:_file_descriptors' \
    '(-d -e -f -p)-e[take password from $SSHPASS]' \
    '(-d -e -f -p)-f+[read password from file]:file:_files' \
    '(-d -e -f -p)-p+[actual password]::' \
    '(-)1:command:->command' \
    '*::arguments: _normal' \
    && return

  case $state in
    (command)
      if ((CURRENT == 2)); then
        # Insist that the first argument must be an option
        compadd -- -d -e -f -p
      else
        compadd ssh ||
        _command_names -e
      fi
      ;;
  esac
}

_sshpass "$@"

简要说明:

  • _arguments安排带有选项的命令的完成。
  • 选项-d-e-f-p互斥的。(-d -e -f -p)-d…指定 的补全,并声明如果选项、或之一已存在,则-d不应提供该补全。-d-e-f-p
  • -d+-d表示及其参数之间的空格是可选的。
  • ->command第一个参数导致_arguments设置$statecommand并在下面继续执行。
  • _normal对于第一个非选项参数之后的参数会导致它们完成,就像命令行以第一个非选项参数开始一样。 after::指示*zsh 将选项从第一个非选项参数中删除。
  • 对于命令名称,请尝试完成传递给的名称compadd(如果需要,可以添加更多名称)。如果失败,请填写任何命令名称。

相关内容