zsh의 gitconfig에 따라 git 별칭을 정의합니다.

zsh의 gitconfig에 따라 git 별칭을 정의합니다.

나는 다음과 같은 줄을 가지고 있습니다 ~/.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

내 것에는 ~/.gitconfig다음이 있습니다.

[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-"

~/.zshrc:

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

gl따라서 gitconfig의 각 별칭에 대해 for git log등과 같은 셸 별칭을 정의하겠습니다 .

이것을 zsh로 포팅하려고 할 때 문제가 발생했습니다. autoload내장된 zsh는 /usr/share/zsh/functions/Completion/Unix/_git특정 git 명령을 완료하려고 처음 시도할 때만 파일을 로드했습니다.

_git파일에서 직접 호출/로드를 시도했지만 .zshrc다른 경고와 함께 작동하지 않습니다.

bash에서와 동일한 기능을 얻기 위해 zsh를 사용하는 올바른 방법은 무엇입니까?

답변1

실제로, _git귀하의 호출은 동반 함수인 include 를 정의하고 일부 완료를 시도하지만 실패하기 때문에 .zshrc작동합니다 (이 특별한 경우에는 오류 메시지도 표시되지 않음)._git__git_aliases이는 대부분의 완성 기능에 적용됩니다.. 나중에 자동 로드용 접근성 기능을 표시 compinit하려면 이 작업을 수행해야 합니다 ._git

% 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

문제는 이를 실행할 때 __git_aliases완료 시에만 사용할 수 있는 내장 함수를 호출한다는 것입니다. 수행하려는 작업만 수행하는 내장 함수와 동일한 이름을 가진 함수를 임시로 정의하여 이 문제를 해결할 수 있습니다. 이는 일반적으로 아무 작업도 수행하지 않지만 매우 서투릅니다. 이 특별한 경우에는 더 쉬운 방법이 있기 때문에 정확한 방법을 보여주지는 않겠습니다.

어쨌든 _git완성 파일을 파헤칠 것이므로 __git_extract_aliases. (참고: 이 답변은 Ubuntu 18.04 버전인 zsh 5.4.2에 대해 작성했습니다. 다른 버전의 zsh는 구조가 다를 수 있습니다 .)__git_aliases__git_extract_aliasesaliases_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

이를 위해서는 여전히 더 많은 노력이 필요하며 다양한 zsh 버전에 대처하기 위해 추가 포팅 작업이 필요할 수 있습니다. __git_extract_aliases기본적으로 한 줄의 코드입니다.

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

관련 정보