如何避免 Bash 中的重复完成

如何避免 Bash 中的重复完成

我定义了基本的完成脚本。对于程序d,可以使用子命令exempt、limit、show、update。

complete -W "exempt limit show update" d

但是,当我在 后按 Tab 时d exempt,bash 再次显示完成菜单。

$ d <tab>
exempt  limit   show    update
$ d exempt <tab>
exempt  limit   show    update
$ d exempt exempt <tab>
exempt  limit   show    update

如何防止 Bash 一次又一次插入相同的单词?

答案1

当您使用基本完成机制时,您所看到的是预期的行为complete -W

如果你想要更智能的补全,你需要编写补全函数(参见《可编程补全》部分)bash手册)并使用complete -F.

以下是如何调整您的示例:

$ comp_d() {
    COMPREPLY=( $(
        if [ "$COMP_CWORD" -eq 1 ]; then
            compgen -W "exempt limit show update" "$2"
        fi
    ) )
}

$ complete -F comp_d d

此类函数必须以数组形式返回完成候选COMPREPLY。我仅在用户完成第一个参数(COMP_CWORD为 1)时使用您的单词列表,否则数组为空。

相关内容