дополнить подсказку точками, если длина подсказки меньше 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%<<, хотя и с пустой строкой подстановки (исчезло ...), но вместо этого вставляем <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должен содержать достаточное количество точек, вышеприведенный вариант, вероятно, является лишь одним из способов его построения.

Это примерно то, что только что прокомментировал Стефан, пока я писал: заполните подсказку точками и позвольте оболочке обрезать ее до нужной длины.

Обратите внимание, что это также приведет к обрезанию полезной части подсказки, если она длиннее $width.

Связанный контент