这可能有点边缘,但我最近转移到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 %
但是当我转到另一个目录时,似乎我的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}%# "
答案 0 :(得分:15)
我在zsh
中自定义提示时遇到了同样的问题。
我相信这是因为当初始化提示时,shell会将值插入字符串一次。后续重新加载在提示中具有常量字符串,而不是子shell插值。
相反,将涉及子壳的任何行放入用单引号定义的变量中。然后插入该变量。
autoload -U colors && colors
local parse_special='%{$fg[yellow]%}$(date)%{$reset_color%}'
PS1="%{$fg[green]%}%n@%m %{$fg[blue]%}%c ${parse_special} %# "
更新:从ZyX的答案中添加此内容,为此制作完整的解决方案。您还需要添加:
setopt promptsubst
事实上,我建议将提示的每个部分提取到这样的变量中,包括每个部分的reset_color。这样做可以让您更改提示组件的顺序,而无需更改其实现。
答案 1 :(得分:7)
你解决这个问题的方法有一半:
PS1='$(date)'
会显示提示$(date)
,但
PS1='$(date)'
setopt promptsubst
会显示提示Thu Aug 9 21:01:53 MSK 2012
(当然取决于$LANG
和$LC_TIME
。
顺便说一句,在最新的zsh中,您不再需要使用%{$fg[blue]%}
,前景为%F{blue}
,背景为%K{blue}
,%f%k
为重置这些内容以及其他一些内容,请参阅man zshmisc
,EXPANSION OF PROMPT SEQUENCES
部分。