在自动完成中扩展命令

时间:2013-07-15 13:05:01

标签: bash shell autocomplete

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

我只需要知道如何使用 使用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

1 个答案:

答案 0 :(得分:0)

是的 - 我发现这个问题刚刚添加了我自己的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,然后附加到COMPREPLY

一些警告 - 由于我们正在使用make完成,我们首先获取原始文件以访问_make。这不是正确的方法 - 将标注更改为_make,如下所示:

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

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

相反,我们直接提供make,并且必须将此脚本添加到completions/make/etc/bash_completion.d,这样可以避免自动加载功能。

希望有所帮助。