Вот связанный вопрос и другое предлагаемое решение:
Как сбросить COMP_WORDBREAKS, не затрагивая другой скрипт завершения?
Как указывалось ранее, самое простое решение - изменить COMP_WORDBREAKS
. Однако изменение COMP_WORDBREAKS
в вашем скрипте завершения небезопасно (так как это глобальная переменная, которая имеет побочный эффект, влияющий на поведение других скриптов завершения - например, scp).
Таким образом, bash complete предлагает несколько вспомогательных методов, которые вы можете использовать для достижения своей цели более эффективным и безопасным способом.
Два вспомогательных метода были добавлены в Завершение Bash 1.2 для этого:
_get_comp_words_by_ref
с опцией -n EXCLUDE
- возвращает слово для завершения без учета символов в ИСКЛЮЧЕНИИ как разрывов слов
__ltrim_colon_completions
Итак, вот базовый пример того, как обрабатывать двоеточие (:) в словах завершения:
_mytool()
{
local cur
_get_comp_words_by_ref -n : cur
# my implementation here
__ltrim_colon_completions "$cur"
}
complete -F _mytool mytool
Использование вспомогательных методов также упрощает сценарий завершения и обеспечивает одинаковое поведение в любой среде (bash-3 или bash-4).
Вы также можете взглянуть на сценарии завершения man
или perl
в /etc/bash_completion.d
, чтобы увидеть, как они используют вышеуказанные вспомогательные методы для решения этой проблемы.