如何使 zsh 中的 RPROMPT 在每次输入时自动更新?

如何使 zsh 中的 RPROMPT 在每次输入时自动更新?

我的RPROMPT设置为使用 来显示 svn 信息vcs_info。上面写着RPROMPT=${vcs_info_msg_0_}vcs_info称为使用precmd().但是,当我更改目录时,RPROMPT 不会更新。仅当我再次调用提示符(通过 source ~/.zshrc 或 Prompt )时它才起作用,并且不会在 chdir 上更改,除非我再次调用提示符。有什么办法可以改变这种行为吗?

答案1

尝试在赋值时在变量值两边加上单引号以延迟计算:

RPROMPT='${vcs_info_msg_0_}'

答案2

使用单引号来延迟计算也适用于定义动态别名。下面是一个别名 ,t用于将新 shell 附加到现有 ssh 代理进程,该进程以名为 的别名启动,ssh-start该别名将 shell 代码写入 homedir 中的文件:

mymistress:~> which ssh-start
ssh-start: aliased to eval `ssh-agent | tee ~/.ssh/ssh-agent.out` ; ssh-add ~/.ssh/id_rsa
mymistress:~> grep "alias t" .zshrc    
alias t="eval `cat ~/.ssh/ssh-agent.out`"
mymistress:~> which t
t: aliased to eval SSH_AUTH_SOCK=/tmp/ssh-nZBZp29804/agent.29804; export SSH_AUTH_SOCK;\nSSH_AGENT_PID=29805; export SSH_AGENT_PID;\necho Agent pid 29805;`

的这个定义t很糟糕,因为它会导致新运行的新信息ssh-start被忽略。将别名定义更改为t在我的 .zshrc 中单引号可以提供更好的行为:

mymistress:~> grep "alias t" .zshrc
alias t='eval `cat ~/.ssh/ssh-agent.out`'
mymistress:~> source ~/.zshrc
mymistress:~> which t
t: aliased to eval `cat ~/.ssh/ssh-agent.out`

t请注意提供的定义的扩展which t,显示了双引号(命令或环境变量的立即就地扩展)与单引号(命令和变量的延迟计算)的效果。

相关内容