zsh случайный цвет в PS1

Мой .bashrc PS1 (сокращенно)

\u\[\e[01;3$(($RANDOM % 8))m\]@\h \w $'

Благодаря тому, как работает bash, он интерполирует случайный цвет после каждой команды, поэтому @ каждый раз имеет другой цвет (по крайней мере, в диапазоне 31-37).

Однако мне не удалось сделать что-то подобное в zsh. Синтаксис $'' не допускает подстановки команд, а также не работает объединение:

$'\e[01;3'$(($RANDOM % 8))
# The \e[01;3 character is printed first, then the random number

Использование кавычек " тоже не работает; он просто выводит буквальное \e...

Я знаю, что zsh также имеет некоторые встроенные цвета текста, такие как %{$fg[red]%}, и я мог бы каким-то образом выбрать случайный цвет из массива, но проблема в том, что он должен быть выбран случайным образом с помощью PS1, а не просто при запуске, иначе случайный выбор будет производиться только один раз.

Есть ли способ интерполировать случайное число в PS1 в zsh для достижения этой цели?


person Explosion Pills    schedule 17.07.2012    source источник


Ответы (1)


Вы можете использовать precmd ловушку, которая будет оцениваться перед каждым приглашением :

randomise_prompt_colour () {
  PS1="%n%B%F{$((RANDOM % 8))}@%m %~ %(!.#.\$) "
}

add-zsh-hook precmd randomise_prompt_colour
person Adam Spiers    schedule 27.02.2013