Можно ли в bash завершить середину слова?
У меня есть простой скрипт завершения bash для моего пользовательского средства поиска веток git.
#/usr/bin/env bash
_branch_completions()
{
local word="${COMP_WORDS[COMP_CWORD]}";
if [ ! -z "$word" ]
then
COMPREPLY=($(compgen -W "`git branch | grep $word`" "${COMP_WORDS[1]}"))
fi
}
complete -F _branch_completions branch
Скрипт "ветвь" ищет в ветвях, поэтому я могу искать
branch 5.9
и я получу
1 release/5.9.0
2 hotfix/5.9.1
3 hotfix/5.9.2
Please select a branch
Мой скрипт завершения bash заполняет вкладку с релизом ветки и дает мне release/5.9.0, но я бы хотел иметь возможность сделать вкладку с веткой 5.9 и получить их все
2 ответа
compgen [option] [word]
...
If word is specified, only those completions matching word will be displayed.
Вы уже фильтруете список с помощью grep, поэтому, чтобы получить желаемое поведение, вы можете просто пропустить второй аргумент compgen, создав свою строку:
COMPREPLY=($(compgen -W "`git branch | grep $word`"))
Necropost, но стоит упомянуть для дальнейших читателей: даже без compgen библиотека readline сама по себе может добавить некоторый беспорядок, когда дело касается неоднозначных совпадений и общих префиксов:
function _bash_completion_smth() {
COMPREPLY=(1aaa2 2aaa3 3bbb4)
}
$ complete -F _bash_completion_smth smth
$ smth[TAB][TAB]
1aaa2 2aaa3 3bbb4
$ smth aaa[TAB][TAB]
1aaa2 2aaa3 3bbb4
$ # word 3bbb4 is undesired
Эти аспекты контролируются переменными библиотеки readline.
show-all-if-ambiguous (Выкл.)
Это изменяет поведение функций завершения по умолчанию. Если установлено значение «Вкл.», слова, которые имеют более одного возможного >завершения, приводят к немедленному перечислению совпадений вместо звонка >колокольчика.
show-all-if-unmodified (Off)
Это изменяет поведение функций завершения по умолчанию аналогично показу всех-если-неоднозначно. Если установлено значение «Вкл.», слова, которые имеют более одного возможного завершения без возможного частичного завершения (возможные завершения не имеют общего префикса), приводят к немедленному перечислению совпадений вместо звонка в колокольчик.
Переменные Readline lib можно настроить непосредственно в функции завершения с помощьюbind "set variable value"
Подробности для обеих переменных описаны здесь: « показать все, если неоднозначно» и «показать все, если не изменено».