我正在为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
答案 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
,这样可以避免自动加载功能。
希望有所帮助。