현재 .zshrc에 다음 줄이 있습니다.
export PROMPT=$(printf "\e[38;5;6m")%m$(printf "\e[m")%d-%h:" "
호스트 이름은 파란색으로 표시되고 기록 및 현재 작업 디렉터리는 일반 터미널 색상으로 표시되어야 합니다. 어떻게 설명해야 할지 잘 모르겠지만 첫 글자를 지정하고 여러 파일 이름이 일치하면 이상하고 예상치 못한 일이 발생합니다. 설명하기가 어렵습니다. 한번 시도해 보세요.
스크린샷:
마무리하기 전:
Tab가능한 완료를 표시 하려면 클릭하세요 .
답변1
메뉴 완성을 표시하고 명령줄을 편집할 수 있도록 허용하기 때문에 항목을 인쇄하고 항목을 지우거나 다시 작성해야 한다는 zsh의 아이디어를 완전히 비활성화했습니다. 이는 팁을 지나치게 복잡하게 만들기 때문입니다.
- 문자열 리터럴을 단어에 넣지 마십시오
printf
. - 색상을 변경하기 위해 하드와이어된 CSI 제어 시퀀스를 사용하지 마십시오.
내가 말했듯이https://superuser.com/a/695350/38062, Z 쉘은 이와 같은 것을 알고 있으며 지시 없이는 시퀀스를 인쇄하지 않습니다. 또한 하드와이어하지 않고도 %F{green}
올바른 이스케이프 시퀀스를 계산할 수 있습니다 .terminfo
PROMPT="%B%F{파란색}%m%f%b%d-%h: "
추가 읽기
답변2
Zsh는 커서를 올바르게 배치하려면 프롬프트의 너비를 알아야 합니다. 프롬프트 너비에 대해 잘못된 값을 가정하면 명령줄을 다시 그릴 때 잘못된 위치에 텍스트가 기록됩니다. 이는 zsh가 가능한 완료를 표시하기 위해 다음 줄로 이동한 후에 발생합니다. 표시되어야 한다고 생각하는 위치에서 완료되도록 명령을 다시 그립니다.
프롬프트에 너비가 0인 이스케이프 시퀀스가 포함되어 있습니다. 그 효과는 다음 텍스트의 모양을 변경하는 것입니다. Zsh는 이것을 모릅니다. 달리 명시하지 않는 한 각 문자의 너비가 1이라고 가정합니다. zsh에게 프롬프트의 일부 너비가 0임을 알리려면 해당 부분을 묶으십시오.%{…%}
.
PROMPT=%{$(printf "\e[38;5;6m")%}%m%{$(printf "\e[m")%}%d-%h:" "
이를 단순화할 수 있습니다. 를 호출하는 대신 구문을 사용하여 백슬래시 이스케이프를 포함 printf
할 수 있습니다 .$'…'
PROMPT=$'%{\e[38;5;6m%}%m%{\e[m%}%d-%h: '
내보내지 마십시오 PROMPT
. 다른 응용 프로그램에서 볼 수 있는 환경 변수가 아닌 내부 셸 변수입니다.
Zsh에는 간단한 방법으로 텍스트의 모양을 변경할 수 있는 힌트 이스케이프 시퀀스가 있습니다. 당신이 무엇을 하려는지 잘 모르겠습니다 38;5;6
. 굵은 파란색은 34;1
이거나 zsh 프롬프트로 탈출합니다.
PROMPT='%F{blue}%B%m%b%f%d-%h: '