일부 정보와 일부 코드 블록이 포함된 manual 에서 다음 코드 블록을 복사한다고 가정해 보겠습니다 .md
(따라서 스크립트 파일이 아님).
⇨⇨⇨⇨(
⇨⇨⇨⇨Indented commands...
⇨⇨⇨⇨)
Zsh preexec
함수를 사용하면 원래 코드 블록에서 모든 선행 공백(일반적으로 탭, 공백일 수도 있음)을 제거하고 들여쓰기되지 않은 버전을 반환할 수 있습니다.
(
commands...
)
내가 이해한 바로는 실행 전 작업에는 's/^\s*//g'
.
preexec를 통해 이를 달성하는 방법을 공유해 주세요.
답변1
preexec
너무 늦을 것이다 . 그때까지 코드가 구문 분석되었습니다. 이를 수정하면 다시 구문 분석해야 합니다(그리고 zsh
코드를 완성하려면 더 많은 줄을 프롬프트해야 할 수도 있습니다).
어쩌면 accept-line
위젯에서 이 작업을 수행할 수 있습니다. 즉, 라인 편집기가 쉘 파서에 라인을 공급하기 전에 다음과 같이 할 수 있습니다.
accept-line() {
emulate -L zsh # default zsh behaviour locally
set -o extendedglob # with extendedglob for ## (= ERE +) below
BUFFER=${BUFFER##[[:blank:]]##} # remove leading blanks
# remove blanks after newlines in case a multiline buffer is accepted
# for instance after a safe-paste or a newline entered with <Alt+Ret>
BUFFER=${BUFFER//$'\n'[[:blank:]]##/$'\n'}
# call original accept-line
zle .$WIDGET
}
zle -N accept-line