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 ~/.gitconfig
tengo:
[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 gl
for git log
y así sucesivamente.
Al intentar portar esto a zsh, tengo un problema: el zsh autoload
integrado solo carga el archivo /usr/share/zsh/functions/Completion/Unix/_git
la primera vez que intento completar algún comando de git.
Intenté llamar/cargar _git
el archivo directamente desde .zshrc
pero, 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 _git
desde su .zshrc
funciona, ya que define _git
y 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 compinit
para que _git
sus 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 _git
archivo de finalización, llama __git_extract_aliases
en lugar de __git_aliases
. __git_extract_aliases
introduce información en la variable aliases
de 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_aliases
es 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