Вопрос по bash, shell – Как сбросить COMP_WORDBREAKS, не затрагивая другой скрипт завершения?

22

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

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

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

    # my implement here

    COMPREPLY=( $(compgen ..........my_implement......... -- $cur) )
}
complete -F _mytool mytool
</code>

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

Есть ли решение для измененияCOMP_WORDBREAKS в одном сценарии завершения и не влияет на другой сценарий?

<code>$ echo $BASH_VERSION
4.2.10(1)-release
</code>

Ваш Ответ

1   ответ
23

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

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

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

  • _get_comp_words_by_ref with the -n EXCLUDE option
    • gets the word-to-complete without considering the characters in EXCLUDE as word breaks
  • __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, Загляните внутрь, чтобы прочитать подробное описание каждого метода и найти больше вспомогательных методов.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcur="${COMP_WORDS[COMP_CWORD]}"Error: User Rate Limit Exceeded_get_comp_words_by_ref -n : curError: User Rate Limit Exceeded_get_comp_words_by_ref -n : cur prev
Error: User Rate Limit Exceeded/etc/bash_completionError: User Rate Limit Exceeded__ltrim_colon_completionsError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/28479216/…

Похожие вопросы