Intereting Posts

получение нечувствительных к регистру завершений с compgen в bash

Я пытаюсь получить мою команду (devmode2) автозаполнение с bash, работающим с compgen -W , мой bashrc имеет:

_devmode2() { COMPREPLY=() local sonames=$(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]}) COMPREPLY=($(compgen -W "${sonames}" -- ${COMP_WORDS[COMP_CWORD]})) } complete -F _devmode2 devmode2 

Пример автозаполнения

 $ devmode2 g<tab> 

приводит к звукам, имеющим следующие значения:

 game-life-adv game-life-sparse getopt-alt git-workflow git-workflow-extra github-testers group-git group-git-ivan Group-Git-Taggers-Maven Group-Git-Taggers-Node Group-Git-Taggers-Perl Group-Git-Taggers-Ruby 

но мое автозаполнение приводит к следующим предложениям:

 game-life-adv game-life-sparse getopt-alt github-testers git-workflow git-workflow-extra group-git group-git-ivan 

Как я могу получить все значения, которые я передаю, чтобы откомпилировать ?

Насколько мне известно, у compgen нет возможности делать нечувствительную к регистру фильтрацию списка параметров, которые вы ему даете.

Существует переменная readline которую вы можете настроить так, чтобы завершение имени файла было нечувствительным к регистру:

 bind "set completion-ignore-case on" 

но это не влияет на поведение compgen , поэтому, вероятно, оно не будет применяться к программируемому завершению. (Его поведение немного странно и с именами файлов.)

Это оставляет вам возможность делать свою собственную фильтрацию вместо использования compgen (или в сочетании с compgen если вам нужны функции, отличные от фильтрации, чего нет в вашем примере).

Вы можете сделать это с помощью простой итерации по списку альтернатив, делая сравнение префикса без учета регистра, но следующая небольшая функция должна работать:

 _devmode2() { local sonames=($(devmode2 --auto --current "${COMP_CWORD}" -- ${COMP_WORDS[@]})) local prefix="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=($(printf %s\\n "${sonames[@]}" | awk -v IGNORECASE=1 -vp="$prefix" \ 'p==substr($0,0,length(p))')) } 

Если devmode2 выводит одну альтернативу на строку, было бы проще просто использовать ее в качестве входа в awk . Кроме того, второй аргумент функции завершения, насколько мне известно, всегда совпадает с ${COMP_WORDS[COMP_CWORD]} . Так что это может быть проще:

 _devmode2() { COMPREPLY=($(devmode2 -auto --current "${COMP_CWORD}" -- "${COMP_WORDS[@]}" \ awk -v IGNORECASE=1 -vp="$2" \ 'p==substr($0,0,length(p))')) }