내에는 다음 줄이 있습니다 ~/.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로 포팅하려고 하는데 문제가 있습니다. 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
기본적으로 한 줄의 코드입니다.
for al in ${${${(0)"$(git config -z --get-regexp '^alias.')"}%%$'\n'*}#alias.}; do
alias g$al="git $al"
done