Ответ 1
Итак, это заинтриговало меня, поэтому я читал через источник завершения bash (доступен в /etc/bash _completion).
Я столкнулся с этой переменной: ${COMP_WORDBREAKS}
, которая позволяет контролировать, какие символы используются для разграничения слов.
Я также столкнулся с этой функцией _get_cword
и дополнительным _get_pword
, рекомендованным для использования вместо ${COMP_WORDS[COMP_CWORD]}
и ${COMP_WORDS[COMP_CWORD-1]}
соответственно.
Итак, собрав все это, я провел некоторое тестирование и вот что я придумал: это, похоже, работает для меня, по крайней мере, надеюсь, это будет и для вас:
# maintain the old value, so that we only affect ourselves with this
OLD_COMP_WORDBREAKS=${COMP_WORDBREAKS}
COMP_WORDBREAKS="${COMP_WORDBREAKS}@"
cur="$(_get_cword)"
prev="$(_get_pword)"
if [[ "$cur" == '[email protected]' ]]; then
COMPREPLY=( $(compgen -f ${cur:2}) )
# restore the old value
COMP_WORDBREAKS=${OLD_COMP_WORDBREAKS}
return 0
fi
if [[ "$prev" == '[email protected]' ]]; then
COMPREPLY=( $(compgen -f ${cur}) )
# restore the old value
COMP_WORDBREAKS=${OLD_COMP_WORDBREAKS}
return 0
fi
Теперь, я признаю, что случаи раскола if
немного грязные, определенно лучший способ сделать это, но мне нужно больше кофеина.
Кроме того, что бы он ни стоил вам, я также обнаружил по пути аргумент -P <prefix>
для compgen
, что помешало бы вам зациклиться на массиве $COMPREPLY[*]}
после вызова compgen
, например
COMPREPLY=( $(compgen -P @ -f ${cur:1}) )
Это немного избыточно перед лицом полного решения.