Многострочный RPROMPT в zsh

Многострочный RPROMPT в zsh

Я знаю, что в 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 будет иметь одну строку.

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