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_の色を設定したり、仮想環境を決定したりするコードは示していません。どちらも機能します。)

新しいシェルが作成されると(iTerm2の新しいウィンドウまたは新しいタブ)、Ruby情報は正しいです。ただし、ファイルによって決定されるように、別のRubyを使用するプロジェクトに切り替えると.ruby-version、右側のプロンプトに表示されるRuby情報が更新されません。ファイルを再ソース.zshrcすると、right-promptが更新されます。

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特に、 oh-my-zshのようなものや、プロンプトなどにgit(または他のバージョン管理)情報を表示する.zshrcものを使用している場合は、自分または他のzsh関連ファイルのどこかですでに定義されている可能性が非常に高いためです。そのように。

問題についてもう少し光を当てる

于 2013-02-01T01:46:48.270 に答える