¿Cómo puedo utilizar las funciones de autocompletar de Bash y los patrones de filtro juntos?

¿Cómo puedo utilizar las funciones de autocompletar de Bash y los patrones de filtro juntos?

Mis bashcomandos se autocompletan correctamente (por ejemplo find, git, etc.), pero esto parece fallar tan pronto como uso filtros para evitar que se completen ciertos patrones de archivos, por ejemplo:

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

Lo anterior debería evitar que el autocompletado seleccione nombres de archivos que coincidan con *.cmiy *.cmopara git. De hecho, esto funciona según lo previsto. Desafortunadamente, esto también interrumpe el autocompletado de gitcomandos e indicadores. Cambiar el orden de carga de los archivos de finalización y la definición anterior no parece importar.

¿Alguna idea sobre cómo hacer que ambas funciones funcionen juntas?

Respuesta1

Le ha indicado a bash que utilice el mecanismo de finalización de archivos integrado para git, en lugar de llamar a la función de finalización externa que comprende la sintaxis del gitcomando. Sólo hay un mecanismo de finalización, no una serie de filtros. Si quieres una serie de filtros, tienes que codificarlos.

Afortunadamente, el script de finalización de git de 2,7 kLoC admite la exclusión de patrones de git addforma natural: agregue estos patrones a .gitignore.

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

Si desea excluir archivos de git addla finalización sin agregarlos a la lista de ignorados de git, creo que tendrá que sumergirse en el script de finalización de git. _git_addllama __git_complete_index_filea which llama __git_index_filespara generar la lista de archivos candidatos y, a su vez, llama __git_ls_files_helpera which llama git ls-filescon las opciones que se pasaron desde _git_add. Entonces en _git_addti podrías cambiar

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

para agregar algunas opciones como --exclude=*.cm[aiox](tenga cuidado con el problema de las comillas: los comodines eventualmente se unen al comando, por lo que -x *.cm[aiox]no funcionarían porque el patrón se expandiría en el directorio actual).

información relacionada