Zsh preexec - 코드 블록에서 모든 선행 들여쓰기를 자르는 방법은 무엇입니까?

Zsh preexec - 코드 블록에서 모든 선행 들여쓰기를 자르는 방법은 무엇입니까?

일부 정보와 일부 코드 블록이 포함된 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

관련 정보