在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 中的每個別名,我將定義一個 shell 別名,例如glforgit log等等。

嘗試將其移植到 zsh 時遇到問題:autoload內建 zsh 僅在/usr/share/zsh/functions/Completion/Unix/_git我第一次嘗試完成某些 git 命令時載入該檔案。

我嘗試_git直接從 調用/加載文件,.zshrc但其他一些警告,它不起作用。

使用 zsh 獲得與 bash 相同的功能的正確方法是什麼?

答案1

實際上,_git從 your呼叫.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(注意:我為 zsh 5.4.2 寫了這個答案,這是 Ubuntu 18.04 上的版本。其他版本的 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基本上是一行程式碼。

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

相關內容