
Meus bash
comandos são preenchidos automaticamente corretamente (por exemplo find
, git
, etc.), mas isso parece falhar assim que uso filtros para impedir a conclusão de certos padrões de arquivo, por exemplo:
complete -f -X '*.@(cmi|cmo)' git
O acima deve impedir que o preenchimento automático selecione nomes de arquivos correspondentes *.cmi
e *.cmo
para git
. Isso realmente funciona como pretendido. Infelizmente, isso também interrompe o preenchimento automático de git
comandos e sinalizadores. Mudar a ordem de carregamento dos arquivos de conclusão e a definição acima não parece importar.
Alguma idéia de como fazer os dois recursos funcionarem juntos?
Responder1
Você instruiu o bash a usar o mecanismo interno de conclusão de arquivo para git
, em vez de chamar a função de conclusão externa que entende a sintaxe do git
comando. Existe apenas um mecanismo de conclusão, não uma série de filtros. Se você quiser uma série de filtros, precisará codificá-los.
Felizmente, o script de conclusão git de 2,7 kLoC suporta a exclusão de padrões de git add
maneira natural: adicione esses padrões ao .gitignore
.
printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore
Se você deseja excluir arquivos da git add
conclusão sem adicioná-los à lista de ignorados do git, acho que você terá que mergulhar no script de conclusão do git. _git_add
chama __git_complete_index_file
which chama __git_index_files
para gerar a lista de arquivos candidatos e, por sua vez, chama __git_ls_files_helper
which chama git ls-files
com as opções que foram passadas desde _git_add
. Então _git_add
você poderia mudar
__git_complete_index_file "--others --modified --directory --no-empty-directory"
para adicionar algumas opções como --exclude=*.cm[aiox]
(cuidado com problemas de citação: os curingas são eventualmente inseridos no comando, portanto -x *.cm[aiox]
não funcionariam porque o padrão seria expandido no diretório atual).