¿Cómo se obtiene una function bash para autocompletese como si fuera algo más?

La autocompletacion normal para el git checkout es tal vez mostrar una list de twigs para que pueda autocomplete. ¿Qué puedo hacer para agregar el mismo comportamiento de autocompletado para mi function que completa el process de git checkout ?

Hipotéticamente:

 function git_checkout () { git checkout $1 do_some_custom_other_stuff } 

¿Cómo lo hago para que la function git_checkout autocompleta lo mismo que el git checkout ?

Si ejecuta complete -p git , puede ver cuál es la finalización pnetworkingeterminada para git .

 $ complete -p git complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git 

La parte importante aquí es el -F __git_wrap__git_main bit.

Si inspecciona la function __git_wrap__git_main :

 $ type __git_wrap__git_main __git_wrap__git_main is a function __git_wrap__git_main () { __git_func_wrap __git_main } 

Puede ver que simplemente llama a la function __git_main través de la function __git_func_wrap . (Puede inspeccionar eso por sí mismo si lo desea).

Al __git_main function __git_main verá que trata de search las funciones _git_XXX según el command que se está ejecutando y, por supuesto, hay una function _git_checkout ( type -t _git_checkout == function ).

Esa function proporciona el soporte de finalización para el git checkout . Eso es lo que quieres para tu function personalizada. Entonces esa es la function que necesita para completar el uso.

Sin embargo, no puede llamar directamente, recuerde que espera un poco de configuration de la llamada __git_func_wrap que comenzó todo esto, por lo que debe envolverlo usted mismo.

Que es exactamente lo que la function __git_wrap__git_main que comenzamos hizo (para __git_main ) sí mismo.

Entonces, escribimos una function como esa:

 __git_wrap_git_checkout() { __git_func_wrap _git_checkout } 

y luego conectarlo como la function de finalización para su function:

 complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout git_checkout 

y deberíamos estar listos para irnos.


Implementar esta function como un git alias en lugar de una function de shell independiente significaría que podríamos aprovechar el soporte de finalización de git incorporado y solo proporcionar la function _git_git_checkout (igual que nuestra function __git_wrap_git_checkout anterior y nombrada de esta manera para _git_ + alias_name que es lo que __git_main espera) y git haría la llamada automáticamente.