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

时间:2013-01-31 21:09:20

标签: rvm zsh rbenv zshrc

我的.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

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

RPS1='${PR_GREEN}$(virtualenv_info)%{$reset_color%} ${PR_RED}${ruby_version}%{$reset_color%}'

(为了简洁起见,我没有展示设置PR_颜色或确定虚拟环境的代码 - 两者都有效。)

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

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

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

3 个答案:

答案 0 :(得分: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

直接在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
}

并将提示中的${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)

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

答案 1 :(得分:1)

使用这个:

export ruby_version
if
  which rvm-prompt &> /dev/null
then
  ruby_version='$(rvm-prompt i v g)'
elif
  which rbenv &> /dev/null
then
  ruby_version='$(rbenv version | sed -e "s/ (set.*$//")'
else
  ruby_version=''
fi

RPS1='${PR_GREEN}$(virtualenv_info)%{$reset_color%} ${PR_RED}'"${ruby_version}"'%{$reset_color%}'

这会将ruby_version变量代码注入RPS1

答案 2 :(得分:0)

看起来你需要使用每次执行命令时执行的precmd挂钩,比如切换文件夹。与您的方式不同,它只在您启动新实例时执行一次。

precmd () {

  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

  #you can use RPROMPT
  RPS1='${PR_GREEN}$(virtualenv_info)%{$reset_color%} ${PR_RED}${ruby_version}%{$reset_color%}'
}

确保不要覆盖此功能,只有在其他地方未创建时才创建它。 B因为它很可能已在.zshrc或其他zsh相关文件中的某处定义,特别是如果您使用的是 oh-my-zsh 或其他显示git的内容(或其他一些版本控制)有关提示或类似事项的信息。

Some more light on the matter