Como posso usar as funções de preenchimento automático do bash e os padrões de filtro juntos?

Como posso usar as funções de preenchimento automático do bash e os padrões de filtro juntos?

Meus bashcomandos 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 *.cmie *.cmopara git. Isso realmente funciona como pretendido. Infelizmente, isso também interrompe o preenchimento automático de gitcomandos 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 gitcomando. 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 addmaneira natural: adicione esses padrões ao .gitignore.

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

Se você deseja excluir arquivos da git addconclusão sem adicioná-los à lista de ignorados do git, acho que você terá que mergulhar no script de conclusão do git. _git_addchama __git_complete_index_filewhich chama __git_index_filespara gerar a lista de arquivos candidatos e, por sua vez, chama __git_ls_files_helperwhich chama git ls-filescom as opções que foram passadas desde _git_add. Então _git_addvocê 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).

informação relacionada