
БлагодаряКлас Мельбурнмой текущий запрос выглядит так
# 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
.