Definir alias de git basados ​​en gitconfig en zsh

Definir alias de git basados ​​en gitconfig en zsh

Tengo las siguientes líneas en mi ~/.aliases:

function __function_exists() {
    declare -f -F $1 > /dev/null
    return $?
}

# git aliases (need to have git bash completion installed)
for al in `__git_aliases`; do
    alias g$al="git $al"

    complete_func=_git_$(__git_aliased_command $al)
    __function_exists $complete_fnc && __git_complete g$al $complete_func
done

Y en mi ~/.gitconfigtengo:

[alias]
    # one-line log
    l = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short

    a = add
    ap = add -p
    c = commit --verbose
    ca = commit -a --verbose
    cm = commit -m
    cam = commit -a -m
    m = commit --amend --verbose

    d = diff
    ds = diff --stat
    dc = diff --cached

    s = status -s
    co = checkout
    cob = checkout -b
    # list branches sorted by last modified
    b = "!git for-each-ref --sort='-authordate' --format='%(authordate)%09%(objectname:short)%09%(refname)' refs/heads | sed -e 's-refs/heads/--'"

    # list aliases
    la = "!git config -l | grep alias | cut -c 7-"

Y en mi ~/.zshrc:

zstyle :compinstall filename '/home/giuliani/.zshrc'
autoload -Uz compinit
compinit
[[ -f $HOME/.aliases ]] && source "$HOME/.aliases"

Entonces, para cada alias en mi gitconfig definiré un alias de shell como glfor git logy así sucesivamente.

Al intentar portar esto a zsh, tengo un problema: el zsh autoloadintegrado solo carga el archivo /usr/share/zsh/functions/Completion/Unix/_gitla primera vez que intento completar algún comando de git.

Intenté llamar/cargar _gitel archivo directamente desde .zshrcpero, aparte de algunas advertencias, no funcionó.

¿Cuál es la forma correcta de tener la misma funcionalidad que tengo en bash, usando zsh?

Respuesta1

En realidad, llamar _gitdesde su .zshrcfunciona, ya que define _gity sus funciones complementarias, incluidas __git_aliases, e intenta completar algo pero falla (sin siquiera un mensaje de error en este caso particular).Esto funciona con la mayoría de las funciones de finalización.. Debe hacer esto después compinitpara que _gitsus funciones auxiliares estén marcadas para carga automática.

% zsh -f
darkstar% autoload compinit          
darkstar% compinit
darkstar% _git 
darkstar% __git_aliases 
_tags:comptags:36: can only be called from completion function
_tags:comptry:55: can only be called from completion function
_tags:comptags:60: can only be called from completion function
_tags:comptags:67: can only be called from completion function

El problema es que cuando ejecuta __git_aliases, llama a funciones integradas que solo se pueden usar mientras se completa. Puedes solucionar esto definiendo temporalmente funciones con el mismo nombre que estas funciones integradas que hacen solo la parte que quieres hacer, lo cual a menudo no es nada, pero es muy complicado. No voy a mostrar cómo porque hay una manera mucho más sencilla en este caso particular.

Dado que de todos modos estás profundizando en el _gitarchivo de finalización, llama __git_extract_aliasesen lugar de __git_aliases. __git_extract_aliasesintroduce información en la variable aliasesde una manera que sea fácil de extraer. (Nota: escribí esta respuesta para zsh 5.4.2, que es la versión de Ubuntu 18.04. Otras versiones de zsh pueden tener una estructura diferente _git).

_git 2>/dev/null
define_git_aliases () {
  local -a aliases; local al
  __git_extract_aliases
  for al in ${aliases%%:*}; do
    alias g$al="git $al"
  done
}
define_git_aliases

Eso sigue siendo mucho más esfuerzo del necesario y potencialmente un esfuerzo adicional de portabilidad para hacer frente a diferentes versiones de zsh. __git_extract_aliaseses básicamente una línea de código.

for al in ${${${(0)"$(git config -z --get-regexp '^alias.')"}%%$'\n'*}#alias.}; do
  alias g$al="git $al"
done

información relacionada