![在zsh中根据gitconfig定义git别名](https://linux22.com/image/154685/%E5%9C%A8zsh%E4%B8%AD%E6%A0%B9%E6%8D%AEgitconfig%E5%AE%9A%E4%B9%89git%E5%88%AB%E5%90%8D.png)
我的 中有以下几行~/.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 别名,例如gl
forgit log
等等。
尝试将其移植到 zsh 时遇到问题:autoload
内置 zsh 仅在/usr/share/zsh/functions/Completion/Unix/_git
我第一次尝试完成某些 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
(注意:我为 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