
Я знаю, что в zsh можно определить многострочные приглашения:
PROMPT='
test
→ '
Но мне было интересно, почему нельзя определить многострочные подсказки справа? Я попробовал:
RPROMPT='
test
still test '
но ничего не появляется. Возможно ли это?
решение1
Вы можете получить желаемый (если я правильно угадал) эффект, используя функцию precmd
, которая выполняется каждый раз перед отображением подсказки, чтобы вывести дополнительные строки над подсказкой.
Используйте, например, этот код
precmd() {
LEFT="The time is"
RIGHT="$(date) "
RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
Объяснение
$LEFT
и$RIGHT
удерживать строки для левой и правой стороны соответственно. Вы можете использовать вывод команды с синтаксисом$(...)
.$RIGHTWIDTH
это разница текущей ширины терминала (сохраненнойзшв$COLUMNS
параметре) и ширина левой строки.$((...))
для математических выражений- Волшебство начинается с
${(l:$RIGHTWIDTH::.:)RIGHT}
, где параметр$RIGHT
дополняется слева (l
) точками (пропустите последнюю:.:
, если вам нужны пробелы) до длины$RIGHTWIDTH
. - Распечатайте дополнительную строку. Повторите команды, если вам нужно больше строк.
PS1
иRPS1
короче дляPROMPT
иRPROMPT
.
Демо
The time is............................................Fri, Sep 18, 2015 8:20:22 PM
foo > _ bar
решение2
По-видимому, возможно задать многострочное приглашение справа:Вот этотсправляется с этим. Однако я бы сказал, что это происходит примерно так:
local top_left='%F{blue}%~%f'
local top_right="%F{green}${git_branch}%f"
local bottom_left='%B%F{%(?.green.red)}%#%f%b '
local bottom_right='%F{yellow}%T%f'
local REPLY
fill-line "$top_left" "$top_right"
PROMPT=$REPLY$'\n'$bottom_left
RPROMPT=$bottom_right
Имея PROMPT
занимать верхнее левое и правое, а также нижнее левое, и RPROMPT занимать нижнее правое. Тем не менее, RPROMPT будет иметь одну строку.