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"

したがって、gitconfig 内の各エイリアスに対して、glforなどのシェル エイリアスを定義しますgit log

これを zsh に移植しようとすると問題が発生します。zsh組み込みでは、 git コマンドを初めて実行しようとしたときにautoloadのみファイルが読み込まれます。/usr/share/zsh/functions/Completion/Unix/_git

_gitファイルを直接呼び出し/ロードしようとしましたが.zshrc、いくつかの警告が表示され、機能しませんでした。

zsh を使用して、bash と同じ機能を実現する適切な方法は何ですか?

答え1

実際、_gitからの の呼び出しは、とその関連関数( を含む).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の代わりにを呼び出します__git_aliases。これにより、抽出しやすい方法で__git_extract_aliases変数に情報が詰め込まれますaliases。(注: この回答は、Ubuntu 18.04 のバージョンである zsh 5.4.2 用に書きました。zsh の他のバージョンでは、 の構造が異なる場合があります_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基本的には 1 行のコードです。

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

関連情報