[英]Seeking better virtualenv/rvm/zsh conditional integration
tldr:我希望zsh
忽略rvm報告系統ruby,僅在實際使用rvm時顯示它。
我已經將zsh
與出色的oh-my-zsh
擴展一起使用了一段時間。 我的提示看起來像這樣, oh-my-zsh
包含gnzh
主題:
╭─emergent@elysian ~/devel/octopress ‹ruby-1.9.3› ‹source*›
╰─➤
請注意‹ruby-1.9.3› ‹source*›
-當然是zsh
主題在做一些事情,以便用rvm
使用的版本以及git
repo的當前分支來整理我。
我還一直在嘗試使用virtualenvwrapper
插件將其與python的virtualenv
使用,並在virtualenvwrapper
本身中進行了一些調整,以避免在$PROMPT
開頭將其簡單地放在(virtualenv)
之前 。
我之所以喜歡它,是因為它僅在將目錄更改為virtualenv
並激活它時才顯示指示( virtualenvwrapper
/ zsh
自動為我執行)。 但是,當我將其轉移到virtualenv
且路徑名開始變長時,這不能很好地工作。 例如:
╭─emergent@elysian ~PROJECT_HOME/djangotutorial/mysite/polls ‹djangotutorial› ‹system› ‹tu
torial02*›
╰─➤
我的終端只有88個字符寬,因此,我的提示主題(包括virtualenvwrapper
, rvm
和git
信息)分布在3行上。
我一直在嘗試的解決方案是僅在我實際上激活了rvm ruby
時才顯示rvm
指示器。 我發現自己從來沒有同時使用這兩者,並且在每個提示行后附加‹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
任何對弄亂shell東西更有經驗的人對我在這里可以做得更好的事情有任何想法嗎? 即使您的建議是告訴我做與現在為止完全不同的事情,以提高實用性和生產率,但我還是不願意聽到。 預先加油,謝謝!
你有這個:
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
加載時,它將運行您所做的編輯。
首先要檢查的是是否可以使用zsh
[builtin] which
來找到rvm-prompt
。 它通過檢查這是否return code
的which
(如果0
,繼續)。 (沒有找到rvm-prompt
是一個不同的問題,與這個答案沒有真正的關系)。
如果確實找到rvm-prompt
,則使用您的編輯來檢查rvm-prompt ivgs
的輸出是否為system
。 不是,所以我們將$rvm_ruby
設置$rvm_ruby
包含對rvm-prompt
的調用 。
然后, zsh
繼續加載主題,最后完成並將$PROMPT
設置$PROMPT
一堆東西, 包括對rvm-prompt
的調用 。 這是非常有用的是要記住, zsh
不重新審視主題邏輯! (這就是為什么我們需要在編輯后將source ~/path/to/theme
作為source ~/path/to/theme
)!
所以有什么問題? 如果rvm-prompt
在外殼程序啟動時未說出system
在 rvm-prompt
下的其余會話中使用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
,但是當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)'
這應該很適合您:
╭─@charmander.local ~ ‹ruby-1.9.3›
╰─ rvm use system
Now using system ruby.
╭─@charmander.local ~
╰─ rvm use default
Using /Users/simont/.rvm/gems/ruby-1.9.3-p362
╭─@charmander.local ~ ‹ruby-1.9.3›
╰─
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.