rbenv版本显示在zsh右键提示不刷新

Mar*_*ols 3 zsh zshrc rvm rbenv

我的.zshrc中有以下代码:

local ruby_version=''
if which rvm-prompt &> /dev/null; then
  ruby_version="$(rvm-prompt i v g)"
else
  if which rbenv &> /dev/null; then
    ruby_version="$(rbenv version | sed -e "s/ (set.*$//")"
  fi
fi
Run Code Online (Sandbox Code Playgroud)

我在RPS1提示符中有这个代码:

RPS1='${PR_GREEN}$(virtualenv_info)%{$reset_color%} ${PR_RED}${ruby_version}%{$reset_color%}'
Run Code Online (Sandbox Code Playgroud)

(为简洁起见,我没有显示设置PR_颜色或确定虚拟环境的代码 - 这两者都起作用.)

创建新shell时(iTerm2中的新窗口或新选项卡),Ruby信息是正确的.但是,如果我切换到使用不同Ruby的项目(由.ruby-version文件确定),则右侧提示中显示的Ruby信息不会刷新.如果我重新获取.zshrc文件,则右键提示会刷新.

我是否需要在函数中包含确定Ruby版本的代码?顺便说一句,我也有setopt promptsubst.zshrc.

当我更改目录时,我错过了什么阻止了右键提示的刷新?

ZyX*_*ZyX 5

您不应该使用此代码

local ruby_version=''
if which rvm-prompt &> /dev/null; then
  ruby_version="$(rvm-prompt i v g)"
else
  if which rbenv &> /dev/null; then
    ruby_version="$(rbenv version | sed -e "s/ (set.*$//")"
  fi
fi
Run Code Online (Sandbox Code Playgroud)

直接在zshrc中:当切换到另一个项目时,它不会更新ruby_version变量.你可以把它改成

function ruby_version()
{
    if which rvm-prompt &> /dev/null; then
      rvm-prompt i v g
    else
      if which rbenv &> /dev/null; then
        rbenv version | sed -e "s/ (set.*$//"
      fi
    fi
}
Run Code Online (Sandbox Code Playgroud)

并改变${ruby_version}你的提示$(ruby_version).或者,如果您确定不需要在每个提示上进行检查(这会减慢速度),您可以使用

function _update_ruby_version()
{
    typeset -g ruby_version=''
    if which rvm-prompt &> /dev/null; then
      ruby_version="$(rvm-prompt i v g)"
      rvm-prompt i v g
    else
      if which rbenv &> /dev/null; then
        ruby_version="$(rbenv version | sed -e "s/ (set.*$//")"
      fi
    fi
}
chpwd_functions+=(_update_ruby_version)
Run Code Online (Sandbox Code Playgroud)

,它只会在您更改当前目录时更新ruby_version.另请注意,您的代码具有误导性:local ruby_version=''直接放入zshrc等同于typeset -g ruby_version=''或仅ruby_version=''定义为定义全局但未导出的变量.zsh中没有文件局部变量(实际代表函数的自动加载文件除外).