3

我的 .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 版本的代码包含在函数中?顺便说一句,我setopt promptsubst的 .zshrc 中也有。

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

4

3 回答 3

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。另请注意,您的代码具有误导性:local ruby_version=''直接放入 zshrc 等同于typeset -g ruby_version=''或只是简单地ruby_version=''定义了全局变量,但没有导出变量。zsh 中没有文件局部变量(除了实际表示函数的自动加载文件)。

于 2013-02-01T03:28:53.350 回答
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

于 2013-01-31T23:59:52.860 回答
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(或其他一些版本控制)信息的东西像那样。

对此事更清楚一些

于 2013-02-01T01:46:48.270 回答