터미널 다시 그리기 문제를 일으키지 않고 zsh 프롬프트에 줄바꿈을 어떻게 넣을 수 있나요?

터미널 다시 그리기 문제를 일으키지 않고 zsh 프롬프트에 줄바꿈을 어떻게 넣을 수 있나요?

내 zsh 프롬프트와 관련된 사소하지만 성가신 문제를 해결하려고 합니다. 내가 보고 있는 문제는 GUI OS 환경(예: OS X 10.7.2의 Terminal.app 또는 iTerm 2)에서 터미널을 사용하고 터미널 창의 크기를 조정하면 터미널이 추가 프롬프트로 다시 그려진다는 것입니다. .

다음을 포함하는 깨끗한 .zshrc에서 문제를 재현했습니다.

export PROMPT=">
"

명확히 말하면 두 줄짜리 파일입니다. 문자열에 리터럴 개행 문자가 있는데, 여러 번(확실히 늙었다) 장소가 갈 길입니다. 이것은 터미널 창의 크기를 조정할 때까지 작동하며, 그 시점에서 중복된 프롬프트 문자열로 끝납니다. 예를 들어 새 창을 열면 다음과 같은 내용이 표시됩니다( *커서의 자리 표시자로 사용됨).

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

그런 다음 창 크기를 조정하여 더 짧게 만들면 다음과 같이 끝납니다.

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

추가 프롬프트 인쇄 횟수는 창 크기를 변경하는 정도(일반적으로 수직)에 대략 비례하는 것 같습니다. 프롬프트 문자열에서 개행 문자를 제거하면 문제가 사라집니다.

나는 와 같은 다양한 것을 시도 했거나 $(print ">\n"). %{%}나는 이것이 개행 문자가 프롬프트 문자열이 실제로 얼마나 긴지, 무엇을 그리는지 혼동한다는 사실과 관련이 있다고 가정합니다. 이 문제는 고칠 수 있나요? 아니면 그냥 안고 살아야 하나요?

답변1

이 문제는 ZSH가 크기 조정 이벤트에서 프롬프트를 다시 인쇄하는 방식으로 인해 발생하며 이전에도 나를 짜증나게 했습니다. 해결책은 $PROMPTprecmd를 사용하여 한 줄로 만들고 프롬프트의 첫 번째 줄을 인쇄하는 것입니다.

따라서 귀하의 예에서는 간단히 다음과 같습니다.

precmd() { print ">" }
export PROMPT=""

또는 print 문에서 프롬프트 확장이 포함된 보다 정교한 예를 보려면 -rP다음 매개변수를 사용하세요.

precmd() { print -rP "%~" }
export PROMPT="%# "

precmd가 두 개 이상 등록되어 있으면 사용해야 합니다 add-zsh-hook precmd( 참조 man zshcontrib).

답변2

다음과 같은 것은 어떻습니까?

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

관련 정보