
Я 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_file
which вызывает __git_index_files
для генерации списка файлов-кандидатов, а он в свою очередь вызывает __git_ls_files_helper
which вызывает git ls-files
с параметрами, которые были переданы на всем пути вниз от _git_add
. Так что _git_add
вы можете изменить
__git_complete_index_file "--others --modified --directory --no-empty-directory"
добавить некоторые параметры, например --exclude=*.cm[aiox]
(остерегайтесь проблем с кавычками: подстановочные знаки в конечном итоге вставляются в команду, поэтому -x *.cm[aiox]
работать не будут, поскольку шаблон будет развернут в текущем каталоге).