나는 git
그것을 별칭으로 지정했습니다 g
. 때로는 사용 g
하고 때로는 사용하지 않습니다.
git add file1
나중에 또 달리고 또 달릴 수도 있겠네요 g add file2
.
file1을 다시 추가하고 싶을 때 g add
zsh 프롬프트에 입력하고 위쪽 화살표를 몇 번 누를 수도 있습니다. 난 안가 git add file1
. 그래서 나는 노력하고 화살표를 위로 올려야합니다 git add
.
다시 말하지만, git add
찾지 못했습니다 g add file2
.
이 느낌은 해결 가능해야합니다. Arrow History 검색에서 별칭을 감지할 수 있는 방법이 있습니까?
답변1
이는 역방향 검색 단계에서 구현하기가 복잡할 수 있습니다.
alias g=grep
g foo /etc/passwd
alias g=git
g status
역검색을 하려면 별칭이 변경되었다는 사실을 알아야 하므로, 프로필 편집 및 쉘 재시작(이력 검색 기능을 위해) 등을 통해 눈에 보이지 않게 별칭이 변경된 경우에는 위의 예시와 다른 정보는 제공되지 않습니다.
대신, 표준 정보를 셸 기록에 기록하는 것이 더 적절할 수 있지만(여전히 다소 복잡할 수 있으므로) 위의 셸 기록은 명령이 실행될 때 지원되는 별칭에 따라 git 또는 grep으로 확장됩니다. 단점: 기록을 직접 관리해야 하며 별칭이 아닌 명령 이름으로 검색해야 합니다.
function zshaddhistory() {
local -a cmd
local i
# split using shell parse, see zshexpn(1)
cmd=(${(z)1})
if (( $#cmd )); then
# alias expand or failing that the command
# NOTE zsh is 1-indexed, not 0-indexed
cmd[1]=${aliases[$cmd[1]]:-$cmd[1]}
for (( i = 2 ; i < $#cmd ; i++ )); do
# look for ; and try to alias expand word following
if [[ $cmd[$((i-1))] == \; ]]; then
cmd[$i]=${aliases[$cmd[$i]]:-$cmd[$i]}
fi
done
# (z) adds a trailing ; remove that
cmd[$#cmd]=()
# write to usual history location
print -sr -- $cmd
fi
# disable the usual history handling
return 1
}
alias g='echo wait for godot'
로딩 후:
% exec zsh -l
% ls
...
% uptime
...
% g ; g
wait for godot
wait for godot
% history
1 ls
2 uptime
3 echo wait for godot ; echo wait for godot
4 history
이는 줄의 시작 부분이나 줄 뒤에 나타날 수 있는 전역 별칭을 지원하지 않습니다 ;
. 코드에 다른 감독이 있을 수 있습니다.
더 많은 코드를 사용하면 원래 코드를 주석으로 포함할 수 있습니다(아마도 옵션 INTERACTIVE_COMMENTS
세트 포함). 하지만 이렇게 하려면 해당 주석을 제거하기 위해 기록 검색 측면에서 더 많은 코드를 추가해야 할 수도 있습니다.
...
# (z) adds a trailing ; remove that
cmd[$#cmd]=()
cmd+=(\# ${1%%$'\n'})
...
어느 시점에서는 특정 요구 사항을 충족하기 위해 모든 기록 저장 및 기록 검색 코드를 다시 작성해야 할 수도 있습니다.