oh-my-zsh 프롬프트 교체

oh-my-zsh 프롬프트 교체

현재 pyenv 설정을 프롬프트에 추가하기 위해 oh-my-zsh에서 intika2 테마를 수정하고 있습니다. OMZ에는 이를 수행하기 위해 intika2 테마의 LEFTINFOS 변수에 추가한 pyenv_prompt_info 명령이 포함되어 있습니다. 이렇게 하면 .zshrc 파일을 가져올 때마다 올바른 pyenv 버전이 제공되지만 pyenv 버전을 변경한 후 후속 프롬프트에서는 올바른 pyenv 버전이 제공되지 않습니다.

제안된 테마 수정의 최소 버전:

function prompt_char {  
    if [ $UID -eq 0 ]; then echo "#"; else echo $; fi
}

LEFTINFOS="$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}"
PROMPT='
╭─$LEFTINFOS
╰─$(prompt_char)%{$reset_color%} '

LEFTINFOS는 내가 추가한 것이 아니라 intika2 테마에 정의되어 있습니다.

이것은 나에게 다음을 제공합니다: 프롬프트 업데이트가 잘못되었습니다.

내가 PROMPT다음으로 변경 하면

PROMPT='
╭─$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}
╰─$(prompt_char)%{$reset_color%} '

그러면 내가 기대하는 동작이 나타납니다. 원하는 행동

Prompt_subst가 설정되어 있음을 확인했습니다. LEFTINFOS예를 들어 정의에 대한 다양한 조정을 시도했지만 %{$(pyenve_prompt_info%)성공하지 못했습니다. 나는 본 적이이것에

수리(즉, 교체 LEFTINFOS)가 쉽습니다.이유를 이해하고 싶습니다.명령 대체가 작동하지 않습니다.

답변1

귀하의 견적이 잘못되었습니다. 정의에서는 LEFTINFOS큰따옴표를 사용하므로 따옴표 안의 내용은 프롬프트가 평가될 때가 아니라 정의가 평가될 때 평가됩니다. PROMPT문자열을 포함 하도록 값을 정렬해야 합니다 $(pyenv_prompt_info). 따라서 LEFTINFOSinclude는 내부 인용문이 확장되지 않도록 $(pyenv_prompt_info)작은 따옴표를 사용하여 정의됩니다 . $…대신 값에는 문자열이 아닌 PROMPT값이 포함되어야 합니다 . 그렇지 않으면 프롬프트에 결과가 확장되지 않고 포함됩니다. 따라서 정의할 때 큰따옴표를 사용하십시오.LEFTINFOS$LEFTINFOS$(pyenv_prompt_info)

다른 변수의 경우에는 중요하지 않을 수 있지만 세션 중에 색상을 조정할 수 있으려면 이전이 아닌 프롬프트 계산 중에도 확장해야 합니다.

LEFTINFOS='$FG[gray][pyenv=$(pyenv_prompt_info)] [%~] %{$reset_color%}'
PROMPT="
╭─$LEFTINFOS
╰─$(prompt_char)%{$reset_color%} "

또한 여기에 제시된 것처럼 $(prompt_char)이는 이상하고 느린 작성 방법 %(!:#:\$)이며 %(!…)유효한 UID를 사용하는 것 외에도 루트 셸에서 일시적으로 권한을 제거하는 경우에만 중요합니다.

사용psvar그리고%1v, %2v, …프롬프트 정의를 더 쉽게 읽고 쓸 수 있게 만들 수 있지만 oh-my-zsh가 이를 방해할지 여부는 알 수 없습니다.

관련 정보