remove - git tags best practices
Finalización de Bash: Honre el alias de Git específico del repositorio al completar alias (1)
No deberías usar alias en casos tan complicados, usa las funciones de bash . Los alias son más como un preprocesador en C (en el sentido de usar), cuando las funciones son más como ... funciones de código. Y he descubierto que también son más "auto-completas".
También puede observar cómo se resuelve este problema en otras conchas, como el fish .
Digamos que bash está configurado con el siguiente alias:
alias up="git --git-dir /path/to/backup/.git"
Y ese repositorio en particular, y solo ese repositorio, tiene el siguiente alias de git:
[alias]
backup = commit --allow-empty-message
¿Cómo puede up
backup
automática completa?
Esto completa automáticamente la backup
pero no up
:
cd /a/different/dir
git --git-dir=/path/to/backup/.git ba
Esto se completa automáticamente con comandos git estándar pero no con backup
:
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up
Edición : Etan tiene razón, la función de finalización necesita ver el alias expandido, así que he creado lo siguiente:
CompletableAlias() {
if (($#<2)); then
return 1
fi
source_c="$1"
target_c="$2"
target_a=( "${@:2}" )
target_s="${target_a[*]}"
alias "${source_c}=${target_s}"
completion_modifier="__${source_c}_completion"
completion_original="$( complete -p "$target_c" 2>/dev/null |
sed ''s/.*-F/W/+/(/w/+/).*//1/''
)"
if [[ -n "$completion_original" ]]; then
read -r -d '''' completion_function <<-EOF
function $completion_modifier() {
COMP_LINE="/${COMP_LINE/#${source_c}/${target_s}}"
((COMP_POINT+=${#target_s}-${#source_c}))
((COMP_CWORD+=${#target_a[@]}-1))
COMP_WORDS=( ${target_a[@]} /${COMP_WORDS[@]:1} )
$completion_original
}
EOF
eval "$completion_function"
completion_command="$( complete -p "$target_c" |
sed "s/${completion_original}/${completion_modifier}/;
s//w/+/$/${source_c}/"
)"
$completion_command
fi
}
source "/usr/share/bash-completion/completions/git"
CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git"
Pero hay problemas inexplicables:
-
up bac<Tab>
no funciona -
up <Tab>
usa la terminación predeterminada y no enumera los subcomandos de git - y muchos más ...
Edición 2 : se actualizó la secuencia de comandos para solucionar los problemas mencionados anteriormente utilizando las sugerencias de Re: Bash para completar los comandos con alias . Aparentemente esta es una tarea bastante común. Sin embargo ahora estoy corriendo en este mensaje de error:
$ cd /a/different/dir
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git