"zsh"에서 별칭을 확장하는 기능에 대한 더 나은 이해

"zsh"에서 별칭을 확장하는 기능에 대한 더 나은 이해

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입력한 내용이 아니라, 특히 별칭이 확장된 정식 버전입니다. 함수 정의의 구문이 올바르지 않으면 세 번째 줄의 테스트가 실패합니다.

관련 정보