
덕분에클라스 멜번내 현재 프롬프트는 다음과 같습니다
# this variable can be changed later to change the fraction of the line
export PROMPT_PERCENT_OF_LINE=40
# make a function, so that it can be evaluated repeatedly
function myPromptWidth() {
echo $(( ${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100 ))
}
# for some reason you can't put a function right in PROMPT, so make an
# intermediary variable
width_part='$(myPromptWidth)'
# if myPromptWidth is less than current prompt ... pad with dots
PS1="%F{013}%${width_part}<...<%d%f%F{012}\${__git_ps1_foo}%f%F{011}%(1j.jobs%j.)%f%(?.%F{004}.%F{001}✕%?)%<<%# %f"
그래서 출력은 다음과 같습니다
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
/home/blueray%
하지만 모든 프롬프트의 길이가 같기를 바랍니다. 프롬프트 길이가 이보다 짧으면 myPromptWidth
점으로 채워야 합니다.
그래서 내 예상 결과는 다음과 같습니다.
/media/blueray/WDPurple/_DataBackup/_Work/_NotesFilteredADOC% cd ~
.............................................../home/blueray%
어떻게 이를 달성할 수 있나요?
업데이트 1
나는 실험을 해왔다 %${width_part}(l.true-text.false-text)
. 이것이 사용될 수 있는지 확실하지 않으므로 문제를 해결하십시오.
답변1
width_part='$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))'
PS1="%F{013}%$width_part<<\${(l[$width_part][.])}%~%F{012}\${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f"
즉, %<width><<truncated-part%<<
빈 대체 문자열(the 는 ...
사라졌음)을 사용하여 여전히 truncation을 수행하지만 대신 여기에서 매개변수가 전혀 적용되지 않은 왼쪽 패딩 매개변수 확장 플래그인 with 의 시작 부분 에 <width>
가치를 삽입합니다..
truncated-part
${(l[<width>][.])}
당신은 모든 것이 있다는 것을 알게 될 것입니다더블-인용되고 $
s 중 일부는 이스케이프되고 일부는 이스케이프되지 않습니다. ( )가 아닌 것은 $width_part
해당 할당 시 확장되고, 있는 것은 문자 그대로 에 삽입되므로 $PS1
각 프롬프트가 계산될 때 확장됩니다. 해당 $PS1
변수 의 실제 값은 다음 과 같습니다.
%F{013}%$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))<<${(l[$((${COLUMNS:-80} * PROMPT_PERCENT_OF_LINE / 100))][.])}%~%F{012}${__git_ps1_foo}%F{011}%(1j.jobs%j.)%(?.%F{004}.%F{001}✕%?)%<<%# %f
답변2
다음과 같은 기능을 사용하여 프롬프트를 적절한 수의 점으로 채울 수 있습니다 myPromptWidth
.
width="$(myPromptWidth)"
print -v dots -f '%*s' $width .
dots=${dots// /.}
PS1="%$width<...<$dots %/%% "
결과 프롬프트는 다음과 같습니다:
......................./tmp%
dots
충분한 수의 점을 포함해야 하며 위의 방법은 아마도 점을 만드는 한 가지 방법일 것입니다.
이것은 내가 글을 쓰는 동안 Stéphane이 방금 언급한 내용과 거의 같습니다. 프롬프트를 점으로 채우고 쉘이 길이에 맞게 자르도록 합니다.
프롬프트의 실제 유용한 부분이 .보다 길면 잘립니다 $width
.