Можно ли в 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 ответа

Решение

Со страницы руководства bash:

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"

Подробности для обеих переменных описаны здесь: « показать все, если неоднозначно» и «показать все, если не изменено».

Другие вопросы по тегам