Как можно совместно использовать функции автозаполнения bash и шаблоны фильтров?

Как можно совместно использовать функции автозаполнения bash и шаблоны фильтров?

Я bashправильно автодополняю команды (например find, git, и т. д.), но эта функция, похоже, ломается, как только я использую фильтры для предотвращения завершения определенных шаблонов файлов, например:

complete -f -X '*.@(cmi|cmo)' git

Вышеуказанное должно помешать автодополнению выбирать имена файлов, соответствующие *.cmiи *.cmoдля git. Это действительно работает так, как и задумано. К сожалению, это также нарушает автодополнение gitкоманд и флагов. Изменение порядка загрузки файлов дополнения и приведенное выше определение, похоже, не имеет значения.

Есть идеи, как заставить обе функции работать вместе?

решение1

Вы указали bash использовать встроенный механизм завершения файла для gitвместо вызова внешней функции завершения, которая понимает синтаксис команды git. Есть только один механизм завершения, а не ряд фильтров. Если вам нужна серия фильтров, вам нужно закодировать ее.

К счастью, скрипт автодополнения git размером 2,7 килобайта поддерживает исключение шаблонов из git addестественным способом: добавьте эти шаблоны в .gitignore.

printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore

Если вы хотите исключить файлы из git addзавершения, не добавляя их в список игнорирования git, я думаю, вам придется погрузиться в скрипт завершения git. _git_addвызывает __git_complete_index_filewhich вызывает __git_index_filesдля генерации списка файлов-кандидатов, а он в свою очередь вызывает __git_ls_files_helperwhich вызывает git ls-filesс параметрами, которые были переданы на всем пути вниз от _git_add. Так что _git_addвы можете изменить

    __git_complete_index_file "--others --modified --directory --no-empty-directory"

добавить некоторые параметры, например --exclude=*.cm[aiox](остерегайтесь проблем с кавычками: подстановочные знаки в конечном итоге вставляются в команду, поэтому -x *.cm[aiox]работать не будут, поскольку шаблон будет развернут в текущем каталоге).

Связанный контент