Я хотел бы предоставить предложения для аргумента, который должен быть процитирован вот так:
$ 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
, я ожидаю, что «%» будет напечатано как предложение. Вывод отладки подтверждает, что мой код верен, пока не запустится compgen
:
$ cmdx 1starg 'argtwoa ####||#|%1|####
Я подозреваю, что невозможно сделать то, что я хочу, поскольку полученное значение args
является правильным, но не значение COMPREPLY
(отлажено с использованием echo
).
То же самое должно работать и для двойных кавычек (я знаю, что мне нужно расширить код).