寻求更好的virtualenv / rvm / zsh条件集成

时间:2013-03-10 19:43:40

标签: ruby rvm zsh

tldr:我希望zsh忽略rvm报告系统ruby,只在实际使用rvm时显示它。

我一直在使用zsh与极好的oh-my-zsh扩展程序一段时间了。我的提示看起来像这样,gnzh包含 oh-my-zsh 主题:

╭─emergent@elysian ~/devel/octopress ‹ruby-1.9.3› ‹source*› 
╰─➤ 

请注意‹ruby-1.9.3› ‹source*› - 当然是zsh主题做了一些事情,以便用rvm正在使用的版本以及当前的分支来解决我的问题。 git回购。virtualenv回购

我也一直在使用virtualenvwrapper插件以及a few tweaks within virtualenvwrapper itself in order to avoid it simply prepending (virtualenv) at the start of my $PROMPT来使用python的virtualenv

我喜欢这个,因为它只显示我将目录更改为virtualenvwrapper并激活它(zsh / virtualenv自动为我做了)的指示。但是,当我将内容转换为╭─emergent@elysian ~PROJECT_HOME/djangotutorial/mysite/polls ‹djangotutorial› ‹system› ‹tu torial02*› ╰─➤ 并且路径名称开始变长时,这种方法效果不佳。例如:

virtualenvwrapper

我的终端只有88个字符宽,因此,我的提示主题(包括rvmgitrvm信息)分布在3行。

我一直在尝试的解决方案是在我实际激活rvm ruby时仅显示‹system›指示符。我发现自己并没有同时使用这两个,并且在我的每个提示行中附加.zsh-theme似乎最终是多余的。

这是我尝试修改我的local rvm_ruby='' # Tests for existence of RVM if which rvm-prompt &> /dev/null; then # !!! THIS IS THE EDIT TO THE THEME I'M ATTEMPTING: !!! # Tests if it's using the system ruby and only displays when RVM is # actually being used. if [ $(rvm-prompt i v g s) != "system" ]; then rvm_ruby='%{$PR_RED%}‹$(rvm-prompt i v g s)›%{$PR_NO_COLOR%}' fi else if which rbenv &> /dev/null; then rvm_ruby='%{$PR_RED%}‹$(rbenv version | sed -e "s/ (set.*$//")›%{$PR_NO_COLOR%}' fi fi local git_branch='$(git_prompt_info)%{$PR_NO_COLOR%}' #PROMPT="${user_host} ${current_dir} ${rvm_ruby} ${git_branch}$PR_PROMPT " PROMPT="╭─${user_host} ${current_dir} ${rvm_ruby} ${git_branch} ╰─$PR_PROMPT " 以实现此目的:

source

但是,它根本没有做任何事情 - 在编辑之前和之后我看不出任何差异。我已经确保~/.zshrc if [ $(rvm-prompt i v g s) != "system" ]; then echo $(rvm-prompt i v g s) fi ╭─emergent@elysian ~/devel/shellscripts ‹system› ╰─➤ ./test.sh ╭─emergent@elysian ~/devel/shellscripts ‹system› ╰─➤ rvm use ruby-1.9.3 Using /home/emergent/.rvm/gems/ruby-1.9.3-p392 ╭─emergent@elysian ~/devel/shellscripts ‹ruby-1.9.3› ╰─➤ ./test.sh ruby-1.9.3 {{1}}。我在一个较小的脚本中测试了条件评估,似乎可以解决:

{{1}}

任何更有经验的人都会对使用shell的东西有所了解,对于我能在这里做得更好有什么想法吗?即使你的建议是告诉我做一些与我现在完全不同的事情,为了提高效用和生产力,我也很想听。欢呼并提前致谢!

1 个答案:

答案 0 :(得分:1)

你有这个:

if which rvm-prompt &> /dev/null; then
  if [ $(rvm-prompt i v g s) != "system" ]; then
    rvm_ruby='%{$PR_RED%}‹$(rvm-prompt i v g s)›%{$PR_NO_COLOR%}'
  fi
else
  # We don't have `rvm-prompt`, try using `rbenv` instead.
fi

让我们来看看这实际上是做什么的。当您打开新终端时,zsh会加载一堆文件,包括~/.zshrc。在~/.zshrc,您source theme。因此,当zsh加载时,它会贯穿您所做的编辑。

它首先检查的是它是否可以使用rvm-prompt [内置] zsh找到which。它通过检查return code的{​​{1}}(如果which,继续)来执行此操作。 (没有找到0是一个不同的问题,并没有真正与此答案相关)。

如果我们执行找到rvm-prompt,则使用您的修改我们会检查rvm-prompt的输出是否为rvm-prompt i v g s。不是,所以我们将system设置为包含对$rvm_ruby 的调用。

然后,rvm-prompt继续加载主题,最后完成并将zsh设置为一堆内容,包括对$PROMPT 的调用。记住rvm-prompt 重新检查主题逻辑非常有用! (这就是我们在编辑之后需要zsh的原因)!

那么问题是什么?如果source ~/path/to/theme在shell启动时没有说rvm-prompt ,我们会在提示中使用system的输出来表示会话的剩余部分。 (如果rvm-prompt 系统,我们的提示中不会显示任何rvm-prompt指示符...因为rvm留空了!)。

现在我们了解了正在发生的事情,我们可以努力修复它。我能想到两种方法。

1。从提示中删除单词rvm_ruby

system

这样可行,但在if which rvm-prompt &> /dev/null; then rvm_ruby='%{$PR_RED%}‹$(rvm-prompt i v g s | sed -e "s/system//")›%{$PR_NO_COLOR%}' else # We don't have `rvm-prompt`, try using `rbenv` instead. fi <>时,您的提示会显示(红色)rvm-prompt

system

您可能会觉得这很有用。我觉得这会让我烦恼。

2。使用更聪明的╭─@charmander.local ~ ‹ruby-1.9.3› ╰─ rvm default ╭─@charmander.local ~ ‹ruby-1.9.3› ╰─ rvm use system Now using system ruby. ╭─@charmander.local ~ ‹› ╰─ :编写函数。

$PROMPT

theme

这对你来说应该很愉快:

function current_rvm() {
  if which rvm-prompt &> /dev/null; then
    if [ $(rvm-prompt i v g s) != "system" ]; then
      # The double quotes make it work, single quotes do not work.
      echo "%{$PR_RED%}‹$(rvm-prompt i v g s)›%{$PR_NO_COLOR%}"
    else
      # `rvm-prompt` is `system`
      echo ''
    fi
  else
    # We don't have `rvm-prompt`, try using `rbenv` instead.
  fi
}
local rvm_ruby='$(current_rvm)'