zsh 프롬프트가 올바르게 이스케이프되지 않았습니다.

zsh 프롬프트가 올바르게 이스케이프되지 않았습니다.

이것은 현재 프롬프트 정의입니다.

PROMPT='%(?..%F{빨간색}%?%f:)%F{파란색}%n%f:%F{녹색}%{${PWD/#$HOME/~}%} % ( !.%F{빨간색}.%f)%# %f'

검색 기록을 사용할 때와 같이 실제 프롬프트 뒤에서 커서가 한 문자 시작되는 경우가 있습니다 ctrlR.

답변1

작업 디렉토리를 인쇄하는 프롬프트 부분과 그 주위를 제거해야 합니다 %{.%}

PROMPT='%(?..%F{red}%?%f:)%F{blue}%n%f:%F{green}${PWD/#$HOME/~} %(!.%F{red}.%f)%# %f'

%{시퀀스는 %}커서 위치에 영향을 주지 않는 힌트 비트 주위에 배치됩니다(예: 하드 코딩된 제어 시퀀스). 실제로 커서를 움직이는 것을 둘러싸면(현재 작업 디렉토리를 인쇄하여) 혼란스러워집니다.다루기 힘든커서가 어디에 있는지에 대한 개념입니다. 현재 줄의 일부를 다시 그려야 할 때(예를 들어 Cr로 검색할 때) 커서가 잘못된 위치에 놓이게 됩니다.

인쇄된 표현이 더 긴 목차로 변경하여 이를 확인할 수 있습니다. 을 사용하면 cd /tmp커서가 1열(길이 /tmp) 대신 4열(길이 ~)만큼 오프셋됩니다.


또는 일반적으로 현재 작업 디렉터리를 포함하는 %~대신 사용할 수 있습니다 . ${PWD/#$HOME/~}따라서 이것이 유일한 교체라면 전원을 끌 수 있습니다 PROMPT_SUBST.

또한 의 경우 ${PWD/#$HOME/~}또는 제어 문자가 포함되어 있으면 문제가 발생합니다. 가능하면 콘텐츠에 제어되지 않은 데이터를 포함하지 않는 것이 가장 좋습니다. 이를 피할 수 없는 경우 프롬프트 문자열로 의미가 있도록 일부 이스케이프를 수행해야 합니다.$PWD%$PROMPT

관련 정보