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个字符宽,因此,我的提示主题(包括rvm
,git
和rvm
信息)分布在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的东西有所了解,对于我能在这里做得更好有什么想法吗?即使你的建议是告诉我做一些与我现在完全不同的事情,为了提高效用和生产力,我也很想听。欢呼并提前致谢!
答案 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
留空了!)。
现在我们了解了正在发生的事情,我们可以努力修复它。我能想到两种方法。
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
您可能会觉得这很有用。我觉得这会让我烦恼。
╭─@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)'