프롬프트 길이가 n보다 작으면 점으로 프롬프트를 채웁니다.

프롬프트 길이가 n보다 작으면 점으로 프롬프트를 채웁니다.

덕분에클라스 멜번내 현재 프롬프트는 다음과 같습니다

# 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.

관련 정보