在打开的单/双引号之后/内处理Bash完成

时间:2014-03-01 22:16:55

标签: bash shell bash-completion quotations

我想提出一个必须引用的论点的建议:

$ cmdx 1starg 'argtwoa %1 %x argtwob'

互动应该是这样的(期望):

$ cmdx 1starg '[TAB TAB]
argtwoa argtwoc %1
$ cmdx 1starg 'argtwob[TAB TAB]
argtwoa argtwoc %1
$ cmdx 1starg 'argtwob 

但是,如果我输入第一个单词(建议的一个)作为第二个参数,Bash不会提供更多示例,但会关闭打开的引用:

$ cmdx 1starg 'argtwob' 

到目前为止,我的完成功能看起来像这样:

function _complete() {
    local cur prev args
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # echo "## prev=|$prev| cur=|$cur| words=[$COMP_CWORDS[@]] word=|${COMP_CWORD}| ##"

    if [ ${COMP_CWORD} -eq 1 ]; then
        args="1starg"

        COMPREPLY=( $(compgen -W "${args}" -- ${cur}) )
        return 0
    elif [ ${COMP_CWORD} -ge 1 ]; then
        args="argtwoa argtwob argtwoc %1"

        if [[ "${cur}" =~ ^\'[^[:space:]]+[[:space:]]$ ]]; then
            args="%1"
        fi

        COMPREPLY=( $(compgen -W "${args}" -- ${cur}) )

        # echo "####|${COMREPLY}|#|${args}|####"
        return 0
    fi
}

complete -F _complete cmdx

当我取消注释第二个调试 - echo并在使用单引号和第一个单词和空格打开第二个参数后按Tab键然后按TAB我希望“%”为印刷为提案。 调试输出确认我的代码在compgen运行之前是正确的:

$ cmdx 1starg 'argtwoa ####||#|%1|####

我怀疑,由于生成的args值正确但不是COMPREPLY值(使用echo调试),因此无法执行我想要的操作。

同样适用于doubleqoutes(我知道,我必须扩展代码)。

0 个答案:

没有答案