tipos tag repositorio remote qué origin existen etiquetas eliminar crear git bash shell unix autocomplete

git - tag - ¿Cómo puedo completar bash para trabajar con alias?



tipos de etiquetas en git (9)

Idealmente, me gustaría que el autocompletado simplemente funcione mágicamente para todos mis alias. ¿Es posible?

Sí, es posible con el proyecto de complete-alias .

Caso en punto:

Estoy en mac con bash v3.2.17, estoy usando git instalado a través de macports con la variante bash_completion.

Cuando git checkout m<tab> . por ejemplo, lo termino para master .

Sin embargo, tengo un alias para git checkout , gco . Cuando gco m<tab> , no obtengo el nombre de la rama autocompletado.

Idealmente, me gustaría que el autocompletado simplemente funcione mágicamente para todos mis alias. ¿Es posible? De lo contrario, me gustaría personalizarlo manualmente para cada alias. Entonces, ¿cómo voy yo tampoco?


Como se indicó en los comentarios anteriores,

complete -o default -o nospace -F _git_checkout gco

ya no funcionará Sin embargo, hay una función __git_complete en git-completion.bash que se puede usar para configurar la finalización de alias de esta manera:

__git_complete gco _git_checkout


En git-completion.bash hay una línea:

complete -o default -o nospace -F _git git

Al mirar esa línea (y la función _git) puede agregar esta línea a su .bash_profile :

complete -o default -o nospace -F _git_checkout gco


Me encontré con este problema también y se me ocurrió este fragmento de código. Esto automáticamente le dará finalización para todos los alias. Ejecútelo después de declarar todos (o cualquier) alias.

# wrap_alias takes three arguments: # $1: The name of the alias # $2: The command used in the alias # $3: The arguments in the alias all in one string # Generate a wrapper completion function (completer) for an alias # based on the command and the given arguments, if there is a # completer for the command, and set the wrapper as the completer for # the alias. function wrap_alias() { [[ "$#" == 3 ]] || return 1 local alias_name="$1" local aliased_command="$2" local alias_arguments="$3" local num_alias_arguments=$(echo "$alias_arguments" | wc -w) # The completion currently being used for the aliased command. local completion=$(complete -p $aliased_command 2> /dev/null) # Only a completer based on a function can be wrapped so look for -F # in the current completion. This check will also catch commands # with no completer for which $completion will be empty. echo $completion | grep -q -- -F || return 0 local namespace=alias_completion:: # Extract the name of the completion function from a string that # looks like: something -F function_name something # First strip the beginning of the string up to the function name by # removing "* -F " from the front. local completion_function=${completion##* -F } # Then strip " *" from the end, leaving only the function name. completion_function=${completion_function%% *} # Try to prevent an infinite loop by not wrapping a function # generated by this function. This can happen when the user runs # this twice for an alias like ls=''ls --color=auto'' or alias l=''ls'' # and alias ls=''l foo'' [[ "${completion_function#$namespace}" != $completion_function ]] && return 0 local wrapper_name="${namespace}${alias_name}" eval " function ${wrapper_name}() { let COMP_CWORD+=$num_alias_arguments args=( /"${alias_arguments}/" ) COMP_WORDS=( $aliased_command /${args[@]} /${COMP_WORDS[@]:1} ) $completion_function } " # To create the new completion we use the old one with two # replacements: # 1) Replace the function with the wrapper. local new_completion=${completion/-F * /-F $wrapper_name } # 2) Replace the command being completed with the alias. new_completion="${new_completion% *} $alias_name" eval "$new_completion" } # For each defined alias, extract the necessary elements and use them # to call wrap_alias. eval "$(alias -p | sed -e ''s/alias /([^=][^=]*/)=''/'''/([^ ][^ ]*/) */(.*/)''/'''/wrap_alias /1 /2 ''/'''/3''/''' /'')" unset wrap_alias


Solo tiene que encontrar el comando complete y duplicar la línea que tiene el nombre del alias en su lugar.

Tengo alias dm="docker-machine" . En palabras, dm será el alias de la docker-machine .

Así que en Mac (vía brew), los archivos de finalización están en cd `brew --prefix`/etc/bash_completion.d/ .
Para mi caso, edité el archivo llamado docker-machine .
Todo el camino en la parte inferior estaba:

complete -F _docker_machine docker-machine

Así que acabo de agregar otra línea, con mi alias:

complete -F _docker_machine docker-machine complete -F _docker_machine d-m


También podrías intentar usar alias de Git. Por ejemplo, en mi archivo ~/.gitconfig , tengo una sección que se ve así:

[alias] co = checkout

Así que podrías escribir git co m<TAB> , y eso debería expandirse a git co master , que es el comando de git checkout .


Tengo un alias de g = ''git'', y combinado con mis alias de git escribo cosas como

$ g co <branchname>

La solución más simple para mi caso de uso específico era agregar una sola línea a git-completion.

Justo debajo de esta línea:

__git_complete git _git

Agregué esta línea para manejar mi único alias ''g'':

__git_complete g _git


Una opción más es usar el archivo ~/.bash_completion . Para crear el alias de gco para el git checkout solo ponlo aquí:

_xfunc git __git_complete gco _git_checkout

Luego en ~/.bashrc tienes que poner solo el alias:

alias gco=''git checkout''

Dos lineas. Eso es.

Explicación:

El ~/bash_completion se obtiene al final del script bash_completion principal. En gentoo encontré el script principal en /usr/share/bash-completion/bash_completion .

El _xfunc git bit se encarga de buscar el archivo git-completion para que no necesites poner nada más en ~/.bashrc .

La respuesta aceptada requiere que copie .git-completion.sh y lo base en su archivo ~/.bashrc , que me parece cojo.

PD: Todavía estoy tratando de encontrar la forma de no fuente de toda la secuencia de comandos git-completion en mi entorno bash. Comenta o edita si encuentras una forma.


Esta página del foro muestra una solución.

Coloque estas líneas en su .bashrc o .bash_profile :

# Author.: Ole J # Date...: 23.03.2008 # License: Whatever # Wraps a completion function # make-completion-wrapper <actual completion function> <name of new func.> # <command name> <list supplied arguments> # eg. # alias agi=''apt-get install'' # make-completion-wrapper _apt_get _apt_get_install apt-get install # defines a function called _apt_get_install (that''s $2) that will complete # the ''agi'' alias. (complete -F _apt_get_install agi) # function make-completion-wrapper () { local function_name="$2" local arg_count=$(($#-3)) local comp_function_name="$1" shift 2 local function=" function $function_name { ((COMP_CWORD+=$arg_count)) COMP_WORDS=( "$@" /${COMP_WORDS[@]:1} ) "$comp_function_name" return 0 }" eval "$function" } # and now the commands that are specific to this SO question alias gco=''git checkout'' # we create a _git_checkout_mine function that will do the completion for "gco" # using the completion function "_git" make-completion-wrapper _git _git_checkout_mine git checkout # we tell bash to actually use _git_checkout_mine to complete "gco" complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco

Esta solución es similar al script de balshetzer , pero solo esta funciona para mí. (El script de balshetzer tuvo problemas con algunos de mis alias).