Подтвердить что ты не робот

Как reset COMP_WORDBREAKS без влияния на другое завершение script?

Что-то меня смущает, когда я реализую функцию автозаполнения bash, которую я поставлю в /etc/bash_completion.d/

Чтобы достичь некоторой функции, я хочу удалить слово break characters colour (:) из переменной $COMP_WORDBREAKS и добавить косую черту (/) в начале $COMP_WORDBREAKS.

COMP_WORDBREAKS=" /'><=;|&("
_mytool()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    compopt -o nospace

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool

Однако я не могу reset COMP_WORDBREAKS напрямую, потому что это значение используется совместно с другими сценариями завершения. К тому времени, как вызывается функция завершения, массив переменных COMP_WORDS уже заполнен, поэтому локальные изменения COMP_WORDBREAKS не влияют.

Есть ли какое-либо решение для изменения COMP_WORDBREAKS в одном завершении script и никакого эффекта для другого script?

$ echo $BASH_VERSION
4.2.10(1)-release
4b9b3361

Ответ 1

Изменение $COMP_WORDBREAKS в вашем завершении script не рекомендуется (поскольку это глобальная переменная, и это может повлиять на поведение других скриптов завершения - например, ssh).

Однако завершение bash предлагает некоторые вспомогательные методы, которые вы можете использовать для достижения своей цели.

Рекомендуемый способ обработки символов, не говорящих по слову, в словах завершения состоит в использовании двух вспомогательных методов:

  • _get_comp_words_by_ref с опцией -n EXCLUDE
    • получает слово до конца, не рассматривая символы в EXCLUDE как разрывы слов
  • __ltrim_colon_completions

Итак, вот основной пример того, как обрабатывать двоеточие (:) в словах завершения:

_mytool()
{
    local cur
    _get_comp_words_by_ref -n : cur

    # my implementation here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )

    __ltrim_colon_completions "$cur"
}
complete -F _mytool mytool

В качестве окончательного совета вспомогательные методы расположены в /etc/bash_completion. Взгляните внутрь, чтобы прочитать подробное описание каждого метода и найти дополнительные вспомогательные методы.