Вопрос по bash, shell – Как сбросить COMP_WORDBREAKS, не затрагивая другой скрипт завершения?
Что-то меня смущает, когда я реализую функцию автозаполнения 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>
Изменение$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
- removes colon containing prefix from COMPREPLY items
(a workaround for http://tiswww.case.edu/php/chet/bash/FAQ - E13)
- removes colon containing prefix from COMPREPLY items
Итак, вот основной пример того, как обрабатывать двоеточие (:) в словах завершения:
_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
, Загляните внутрь, чтобы прочитать подробное описание каждого метода и найти больше вспомогательных методов.