You can set a precmd
function that resets your prompt just before it is displayed each time.
set_red_prompt_background () {
if [[ ${(%):-%M} = *PROD* ]]; then
PS1="%K{red}$PS1%k"
else
PS1="%F{green}%B$PS1%f%b"
fi
}
typeset -a precmd_functions
precmd_functions+=(set_red_prompt_background)
This isn't tested, so I'd be surprised if it works as is. But here's how it's intended to work.
${:-foo}
is a special type of "parameter" expansion which just expands to the word following the :-
. Seems useless at first...
${(%):-%M}
is the same as above, but has the (%)
flag to instruct zsh
to process any prompt escapes found in the expansion. This turns into a fancy way of getting the full host name that would appear in the prompt using the %M
escape.
- Check if it matches the pattern
*PROD*
, i.e., does the host name contain PROD.
- Take whatever the value of
PS1
is, and wrap it in %K{red}...%k
to make the background red. Note that this might override any background colors already set in PS1
.
- Add
set_red_prompt_background
to the list of functions executed prior to displaying the prompt. If you add any functions after this, they could potentially override the color you set here.
if
condition in your.zsh
file (under your root directory) andset prompt = '...'
– Pinupif...
to set the prompt, your prompt will be set once (at loading) and won't change afterwards. I'd put a conditional in a function: see this question for an example. – Recital