
Mis bash
comandos 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 *.cmi
y *.cmo
para git
. De hecho, esto funciona según lo previsto. Desafortunadamente, esto también interrumpe el autocompletado de git
comandos 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 git
comando. 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 add
forma natural: agregue estos patrones a .gitignore
.
printf '%s\n' '*.cm[aiox]' '*.cmxa' '*.[ao]' >>.gitignore
Si desea excluir archivos de git add
la 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_add
llama __git_complete_index_file
a which llama __git_index_files
para generar la lista de archivos candidatos y, a su vez, llama __git_ls_files_helper
a which llama git ls-files
con las opciones que se pasaron desde _git_add
. Entonces en _git_add
ti 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).