zsh
이 위젯 이 어떻게 작동하는지 이해하려고 노력 중입니다 .
expand-aliases() {
unset 'functions[_expand-aliases]'
functions[_expand-aliases]=$BUFFER
(($+functions[_expand-aliases])) &&
BUFFER=${functions[_expand-aliases]#$'\t'} &&
CURSOR=$#BUFFER
}
zle -N expand-aliases
bindkey '\e^E' expand-aliases
여기서 코드를 찾았어요답변. 그 목적은 명령줄에서 별칭을 클릭할 때 모든 별칭을 확장하는 것입니다 C-M-e
.
작동하지만 코드에 내가 이해하지 못하는 몇 가지 사항이 있습니다.
제가 이해하는 것과 이해하지 못하는 것은 다음과 같습니다.
zle -N expand-aliases
expand-aliases
이 줄은 같은 이름의 함수를 호출하는 위젯을 설치합니다 .
bindkey '\e^E' expand-aliases
이 줄은 위젯을 키 코드에 바인딩합니다 C-M-e
.
unset 'functions[_expand-aliases]'
functions
배열이 어떻게 채워지는지 모르기 때문에 이 줄을 이해할 수 없습니다 .
functions[_expand-aliases]=$BUFFER
functions
이 줄은 key 를 사용하여 연관 배열에 현재 명령줄의 내용을 저장합니다 _expand-aliases
.
(($+functions[_expand-aliases])) &&
이 줄의 작동 방식을 더 잘 이해하기 위해 다음 명령을 실행했습니다.
alias ls='ls --color=auto'
alias -g V='|vipe'
functions[_expand-aliases]='ls V'
echo $functions[_expand-aliases] → ls --color=auto | vipe
echo $+functions[_expand-aliases] → 1
(($+functions[_expand-aliases])); echo $? → 0
확실하지는 않지만 이 결과를 보면 $functions[_expand-aliases]
현재 명령줄의 별칭을 어떻게든 확장하고 $+functions[_expand-aliases]
명령줄이 구문적으로 유효한지 확인하는 데 사용되는 부울 플래그를 반환한다고 생각됩니다.
그러나 토큰을 이해하지 못합니다 $+
. 모든 매뉴얼 페이지에서 검색했지만 zsh
찾을 수 없었습니다.
BUFFER=${functions[_expand-aliases]#$'\t'} &&
이 줄은 명령줄의 내용과 확장을 재정의할 수 있습니다.
CURSOR=$#BUFFER
이 줄은 커서를 명령 끝에 위치시킵니다.
누군가 이 코드가 어떻게 작동하는지 더 잘 설명해 줄 수 있나요? 아니면 최소한 토큰과 배열을 zsh
설명하는 매뉴얼 페이지 의 일부를 인용하시겠습니까 ?$+
functions
답변1
$+functions[_expand-aliases]
연관 배열에 functions
키가 포함되어 있으면 1이고 _expand-aliases
, 그렇지 않으면 0입니다. 이것은수동처럼. 항목 아래에 설명서에는 버팀대가 선택 사항이라고 설명되어 있습니다. 설명서에는 사용할 수 있다고 명시적으로 나와 있지 않은 것 같습니다.${+name}
${name}
첨자 배열 이름이름 대신. zsh 매뉴얼은 읽기 쉽지 않습니다.
이 functions
배열은 함수 정의와 관련된 "마법의" 연관 배열입니다. 함수를 정의하면 이 배열에 요소가 추가됩니다. 여기서 키는 함수 이름이고 값은 정규화된 함수 본문입니다. 대신, 배열에 요소를 추가하면 주어진 이름과 본문을 가진 함수가 정의됩니다.
unset 'functions[_expand-aliases]' # unset any previous function
functions[_expand-aliases]=$BUFFER # define a function whose body is the content of the command line
(($+functions[_expand-aliases])) && # if the command line is a syntactically correct function body, then …
BUFFER=${functions[_expand-aliases]#$'\t'} && # set the command line to the normalized function definition
CURSOR=$#BUFFER # move the cursor to the end of the command line
일반 배열 이라면 functions
값이 변경되지 않으며 BUFFER
(선행 탭 문자 제거 제외) 세 번째 줄의 테스트는 항상 true입니다. 그러나 의 "마법적인" 특성으로 인해 functions
입력한 내용이 아니라, 특히 별칭이 확장된 정식 버전입니다. 함수 정의의 구문이 올바르지 않으면 세 번째 줄의 테스트가 실패합니다.