~/.zshrc
아래 코드 에 포함했습니다 .
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
...나는 지금답변이 문제에 대한무언가를 확인할 때 반만 입력된 명령을 기억하세요.
작동하지만 원래 코드에는 다음 명령문이 포함되어 있습니다.
emulate -LR zsh
이해 하고 옵션을 찾기 위해 emulate
내부 명령을 찾고 있습니다 .man zshbuiltins
-L
-R
emulate -R zsh
모든 옵션을 기본값으로 재설정하는 것 같습니다 . 이를 확인했습니다.
vimdiff <(setopt) <(emulate -R zsh; setopt)
그러나 emulate -R zsh
대화형 셸에서 실행하면 옵션이 명시적으로 재설정되므로 옵션의 새 값을 현재 함수(있는 경우)에 로컬로 만들기 위해 -L
플래그가 필요한 곳 이라고 생각합니다.
이는 옵션이 전역 옵션 외에도 로컬 값을 가질 수 있으며, 충돌이 발생할 경우 로컬 옵션이 우선한다는 의미로도 보입니다.
따라서 emulate -LR zsh
위젯 작성자가 함수가 호출될 때 옵션이 무엇인지 궁금해하거나 (함수 시작 부분에서) 저장한 다음 복원(함수 시작 부분에서)할 필요가 없는 기본 및 예측 가능한 옵션 값으로 로컬 환경을 다시 만드는 데 사용됩니다. end) 위젯의 예상 동작을 변경할 수 있는 모든 옵션입니다.
그 줄이 없어도 작동하는 것 같아서 복사하지 않았습니다. 그러나 이 명령에 대한 나의 이해가 올바른지, 그리고 누군가가 emulate -LR zsh
부작용을 피해야 하는 간단한 예나 두 가지를 제공할 수 있는지 알고 싶습니다 .
답변1
당신의 이해가 정확합니다.
emulate -R zsh
모든 옵션을 zsh 기본값으로 재설정합니다. 이 -L
플래그는 이를 포함하는 함수에 대해 로컬로 만듭니다(더 일반적으로는 모든 옵션 변경 사항을 해당 함수에 대해 로컬로 만듭니다).
emulate -LR zsh
옵션이 다를 수 있는 컨텍스트(특히 대화형 셸에서)에서 함수를 사용해야 하는 경우 함수 정의를 시작 부분 근처에 배치하는 것이 위생적으로 좋습니다.
이 특별한 경우에는 emulate -LR zsh
코드가 어떤 옵션의 영향도 받지 않으므로 필요하지 않습니다. 그러나 그것은 아무런 해를 끼치 지 않습니다.
다음은 사용자가 초기화 파일에서 설정할 수 있거나 함수를 호출하고 잠재적으로 함수를 중단시키는 주변 코드에 의해 비활성화될 수 있는 옵션의 몇 가지 예입니다.
- 폐쇄
bare_glob_qual
glob 한정자의 잘못된 사용. - 폐쇄
care_glob
또는case_match
함수 내에서 의미가 없더라도 특정 패턴 일치에서는 대소문자를 구분하지 않습니다. null_glob
그리고csh_null_glob
어떤 파일과도 일치하지 않는 glob 패턴의 동작에 영향을 줍니다.numeric_glob_sort
사전순으로 확장된 패턴이 필요한 기능이 중단될 수 있습니다.err_exit
그리고unset
함수의 코드가 기본 동작(명령 상태를 무시하고 정의되지 않은 변수를 빈 것으로 처리)을 수행하려고 하면 오류가 발생할 수 있습니다.