我正在编写一个bash命令行工具,我想使bash完成使用完全。
我有以下bash完成。在Ieval "$(./cli completion)"
(输出如下)之后,在bash中完成工作很好:
#!/usr/bin/env bash
# This bash completions script was generated by
# completely (https://github.com/dannyben/completely)
# Modifying it manually is not recommended
_cli_completions() {
local cur=${COMP_WORDS[COMP_CWORD]}
local comp_line="${COMP_WORDS[*]:1}"
case "$comp_line" in
'completions'*) COMPREPLY=($(compgen -W "--help -h" -- "$cur")) ;;
'download'*) COMPREPLY=($(compgen -W "--force --help -f -h" -- "$cur")) ;;
''*) COMPREPLY=($(compgen -W "--help --version -h -v completions download" -- "$cur")) ;;
esac
}
complete -F _cli_completions cli
但是,它们在ZSH中不能正常工作。我已经确定的问题是,COMP_WORDS
不是一个数组,当我在ZSH内,但它在bash内。这将中断local comp_line="${COMP_WORDS[*]:1}"
行。
。在./cli download <tab>
的情况下,comp_line
应该是download
,但在ZSH它是/cli download
(只有.
被删除),所以我总是在最后一个情况下结束''*
。
我正在使用ZSH 5.8和Oh-My-ZSH。Bash完成通常在ZSH中工作。Oh-My-ZSH使用
设置完井fpath=($ZSH/functions $ZSH/completions $fpath)
autoload -U compaudit compinit
我已经尝试设置setopt shwordsplit
,希望这会导致COMP_WORDS
被视为一个数组,但它没有效果。
是否有一个ZSH配置,我可以改变使这个完成脚本工作?或者是否对完成脚本进行了bash兼容的更改,使其在两个shell中都能工作?
这个问题在这个Github票据中讨论。
ZSH应该完全能够处理bash完成,当它被配置为这样做时,在~/.zshrc
中添加这两行:
# Load bash completion functions
autoload -Uz +X compinit && compinit
autoload -Uz +X bashcompinit && bashcompinit
另外,由完全gem生成的脚本似乎有问题。
将*
替换为@
似乎可以同时在bash和zsh上工作。
local comp_line="${COMP_WORDS[*]:1}" # broken
local comp_line="${COMP_WORDS[@]:1}" # works
这个更改现在是bashly和完全gems的一部分。