私は次のような行を持っています~/.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の各エイリアスに対してforgit 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_aliases
aliases
_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