zsh中不重新计算我的shell提示符(zsh not re-computing my shell

2019-06-26 21:41发布

这可能是有点边缘,但我最近搬到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}%# "

Answer 1:

我碰到了同样的问题,而定制我的提示中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。 这样做可以让你改变提示组件的顺序不改变它们的实现。



Answer 2:

您是一半的方式来解决这个问题:

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



文章来源: zsh not re-computing my shell prompt