簡體   English   中英

尋求更好的virtualenv / rvm / zsh條件集成

[英]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個字符寬,因此,我的提示主題(包括virtualenvwrapperrvmgit信息)分布在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 codewhich (如果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留為空白!)。

現在我們了解發生了什么,我們可以對其進行修復。 我可以想到兩種方法。

1.從提示中刪除單詞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-promptsystem時,在提示符下顯示(紅色) <>

╭─@charmander.local ~ ‹ruby-1.9.3›
╰─ rvm default
╭─@charmander.local ~ ‹ruby-1.9.3›
╰─ rvm use system
Now using system ruby.
╭─@charmander.local ~ ‹›
╰─

您可能會發現這很有用。 我想這會惹惱我。

2.使用更智能的$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM