这可能有点小众,但我最近切换到了zsh,并且在定制我的Shell提示符时遇到了问题。
我的.zshrc的一部分看起来像这样:
# keeping this simple right now by just printing the date, but imagine this function would look for something specific when moving to a new directory each time
function parse_special {
print $(date)
}
autoload -U colors && colors
PS1="%{$fg[green]%}%n@%m %{$fg[blue]%}%c %{$fg[yellow]%}%{$(parse_special)%} %{$reset_color%}%# "
当我启动终端时,一切看起来都很好;我的提示符与我预期的一样:
me@someHost ~ Wed Aug 8 22:56:22 PDT 2012 %
但是,当我cd到另一个目录时,似乎我的parse_special函数没有再次被调用来重新计算我的自定义提示(注意日期没有改变):
me@someHost ~ Wed Aug 8 22:56:22 PDT 2012 % cd .ssh
me@someHost .ssh Wed Aug 8 22:56:22 PDT 2012 % cd ../workspace
me@someHost workspace Wed Aug 8 22:56:22 PDT 2012 %
有没有办法告诉zsh每次显示提示符之前都重新计算一次?
非常感谢任何建议。
回复cjhveal:
似乎PS1不喜欢由单引号值设置。我尝试了以下内容:
local tp1="%{$fg[green]%}%n@%m%{$reset_color%}"
PS1="${tp1}"
print "PS1 set by tp1: ${PS1}"
local tp2='%{$fg[green]%}%n@%m%{$reset_color%}'
PS1="${tp2}"
print "PS1 set by tp2: ${PS1}"
我得到了这个输出
#inner stuff was green
PS1 set by tp1: %{%}%n@%m%{%}
#everything was uncolored
PS1 set by tp2: %{$fg[green]%}%n@%m%{$reset_color%}
我还要补充一点,参考cjhveal的建议,这是我实际尝试过的代码。同样地,单引号似乎会导致问题。function parse_special {
print $(date)
}
autoload -U colors && colors
local prompt_user='%{$fg[green]%}%n@%m%{$reset_color%}'
local prompt_root='%{$fg[red]%}%n@%m%{$reset_color%}'
local prompt_dir='%{$fg[blue]%}%c%{$reset_color%}'
local prompt_special='%{$fg[yellow]%}%{$(parse_special)%}%{$reset_color%}'
PS1="${prompt_user} ${prompt_dir}${prompt_special}%# "
%{
%}
将文本括起来,告诉 zsh 应该将其视为零宽度(通常是一些序列,告诉终端对接下来的文本进行某些操作,如更改其颜色)。如果你在其中括起非零宽度的文本,它仍然会被显示出来,但会出现许多错误(例如,当你完成时,zsh 告诉终端它想要光标在某个位置并在那里放置文本。%{非零宽度文本%}
会使这个位置错误,并且你会得到覆盖提示符并以提示符颜色着色的文本)。 - ZyXPS1='......'
。 - Muhammad Umer