1

我正在为 make 命令(称为 user_make)编写一个新的自动完成,它应该将参数扩展到现有的 make 自动完成。问题是它删除了执行 make auto complete 时已经在那里初始化的所有命令,我无法更改原始的 make auto 完成。

我只需要知道如何将 COMPREPLY 与 compgen 一起使用,而不是创建新的命令列表,而只是使用新参数对其进行扩展。

有人知道吗?

#!/bin/sh
# bash completion for ovirt-engine

function _make_auto_completion ()
{
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    #
    #  The basic options we'll complete.
    #
    local cmds
    cmds=`gmake -pn | grep -A1 "^# makefile"| grep -v "^#\|^--" | uniq | awk '/^[A-Za-z]/ {print $1}'`
    COMPREPLY=( $( compgen -W "$cmds" -- "$cur" ) )
    return 0
}
complete -F _make_auto_completion make
4

1 回答 1

0

是的 - 我发现这个问题刚刚添加了我自己的扩展来make完成 - 尽管我的方法可能不适合您的需求。

在我的情况下,如果参数匹配,我将覆盖完成,然后回退到正常make完成。因此,如果我完成了,我会短路正常的 make 完成(即提前返回):

. /usr/share/bash-completion/completions/make

_my_make ()
{
  local cur prev words cword split=false
  _init_completion -n = || return

  # see if we are in "my" build environment
  if [ -e some-reference.mk ]; then

    # Add your completions here

  fi

  # return now if reply already specified
  [[ $COMPREPLY ]] && return

  # defer to normal make
  _make
}

complete -F _my_make make

如果您希望扩展make 完成选项,您可以_make自己调用,然后附加到COMPREPLY.

一些注意事项 - 因为我们使用的是 make 完成,所以我们首先获取原始文件以访问_make. 这不是正确的方法 - 将标注更改_make为如下所示:

_xfunc make _make  # this way we don't need to source the make completion

但是 - 我们有问题,因为我们正在重写complete规则make。通常 bash-completion 会延迟加载完成 - 当您尝试完成时,make它会加载名为completions/make. 这将消除我们对make完成的所有权。此外,如果您想打球,您必须更换completions/make,以便您的代码可以运行而不是原始make代码。

相反,我们completions/make直接 source 并且必须将此脚本添加到/etc/bash_completion.dor $(HOME)/.bash_completion,这避免了自动加载功能。

希望有帮助。

于 2016-05-08T12:51:44.500 回答