Bash完成在ZSH/Oh-My-ZSH中不工作,因为COMP_WORDS不是数组



我正在编写一个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的一部分。

相关内容

最新更新