Reevaluate the prompt expression each time a prompt is displayed in zsh
Solution 1
Make sure that the prompt_subst
option is turned on. If necessary, add the following line to your ~/.zshrc
:
setopt prompt_subst
This tells zsh to reevaluate the prompt string each time it's displaying a prompt. Then, make sure you are assigning PS1
(or some other variable that is used by the prompt theme) as desired:
PS1='${PWD/#$HOME/~}'
The single quotes protect the special characters such as $
from being evaluated when you set the variable.
Solution 2
In zsh, precmd
can do anything (such as setting a variable) before each prompt:
function precmd() {
current_git_branch=`git rev-parse --abbrev-ref HEAD`
}
http://zsh.sourceforge.net/Doc/Release/Functions.html
This isn't so necessary for the current directory as in the original question, but may be helpful for people who find this question for other cases.
(precmd is zsh-only — in bash, there is $PROMPT_COMMAND
.)
Solution 3
Ok,
I just need to escape my $
signs. For example:
${PWD/#$HOME/~}
\${PWD/#\$HOME/~}
Spencer Rathbun
Updated on September 18, 2022Comments
-
Spencer Rathbun over 1 year
I'm adjusting my zsh prompt, based upon the dallas theme and the dstufft theme from oh-my-zsh. I love how dallas has various sections of the prompt contained in variables, which makes it much easier to understand what's going on.
The problem is, these strings are evaluated once for expansion. So when I attempt to use something dynamic, such as the
${PWD/#$HOME/~}
of dstufft, then it no longer updates dynamically.How can I get the best of both worlds? I'd like the prompt broken up into subsections that are evaluated each time the prompt gets written.
-
Spencer Rathbun almost 12 yearsI'm following Steve's approach here. You can see the issue that
%~
brings up. I'm also running some functions in the prompt. -
Gilles 'SO- stop being evil' almost 12 years@SpencerRathbun
unsetopt cdable_vars
would solve the issue of environment variables creeping into%~
. -
Spencer Rathbun almost 12 yearsOh duh! I can't believe I was using double quotes instead of single quotes. Too much Windoze...
-
user3820606 over 4 yearsif you are using oh-my-zsh, do not name your function
precmd()
, but different, e.g.extra_precmd()
and add aprecmd_functions+=extra_precmd
in your~/.zshrc
somewhere after the having sourcedoh-my-zsh.sh
-
user3834306 over 3 yearsWhy isn't this answer upvoted more? Worked for me in
zsh
, much easier than other suggestions