TextMate
可以使用 TM_RUBY 環境變數在 TextMate 中支援 RVM gemsets。目前,RVM 有兩個可能的現成設定檔 - 一個是 rvm-auto-ruby,它支援根據 .rvmrc 自動偵測 ruby(如果可能的話),另一個則使用 RVM 內建的包裝器功能為固定的 ruby 版本產生二進位檔。
對這兩個來說,首先保持最新狀態很重要 - 在最近的版本中,您可以使用下列指令執行此動作
rvm get head
您也應該選擇一個預設的 Ruby,例如將 1.9.2 設定為您的預設
rvm --default use 1.9.2
rvm-auto-ruby 方法
rvm 預設會附帶一個 ruby 二進位檔,通常位於 ~/.rvm/bin(或在系統範圍的安裝中,位於 /usr/local/bin 內),它會在執行 ruby 之前執行下列步驟
- 載入 RVM
- 尋找任何 RVMRC 檔案並載入它們
- 以正常的 ruby 執行
此方法讓您可以在每個專案的基礎上切換 ruby,而無需任何額外的作業。安裝 rvm 後,這只需取得 rvm-auto-ruby 的完整路徑,方法如下
which rvm-auto-ruby
在 textmate 偏好的進階區段中,新增或變更 TM_RUBY 變數以指向給定的路徑,如 此螢幕截圖 中所示,其中包含範例安裝。
RVM 包裝器方法
如果您希望您的 TextMate 安裝始終使用單一的 ruby 和 gemset 組合,您需要改用 rvm 包裝器方法。這會產生一個 ruby 二進位檔,TextMate 可以使用它。要使用此方法,請先決定您希望使用的 ruby 和 gemset 組合。在我們的範例中,我們將使用
rbx@rails3(任何可以由 rvm 使用的解析,例如 ree、1.8.7、1.9.2@ninja-attack,都可以使用包裝器指令)。
接下來,你需要產生一個指令。rvm wrapper 指令的一般結構為
rvm wrapper [ruby_string] [wrapper_prefix]
在我們的案例中,因此我們執行
rvm wrapper rbx@rails3 textmate
這個指令會在你的 rvm bin 路徑中建立一個檔案(如前面所述),稱為
textmate_ruby我們可以用來作為 TM_RUBY 的值。因此,開啟 TextMate 並前往 textmate 偏好的進階面板,新增或變更 TM_RUBY 變數為執行
which textmate_ruby在指令列上的輸出(例如 /Users/wayne/.rvm/textmate_ruby)。
現在關閉 textmate 並重新開啟它,讓套件和 TM_RUBY 設定生效。
測試你的 wrapper
現在你可以透過以下步驟測試它是否運作
- 開啟一個新文件
-
將這個程式碼放入新文件中
puts RUBY_DESCRIPTION
- 將檔案儲存為 'ruby_test.rb'
- 按下 Command + R 執行 ruby
當你希望切換 textmate 預設使用的 ruby 版本時,你可以依照下列方式變更你的預設 RVM ruby 版本
$ rvm use rbx@rails3 --defaultRVM 也會根據每個專案的 .rvmrc 檔案切換 ruby 版本和 gemset
自動化 wrapper 指令
如果你希望 TextMate 的 Ruby 在每次 rvm 變更目前的 Ruby 時切換,那麼你可以透過讓腳本檔案可執行,在 rvm 的 hooks 目錄中啟用「after_use_textmate」hook
$ cd ~/.rvm/hooks $ chmod +x after_use_textmate
現在,當你切換到一個專案目錄,且 rvm 自動切換 Ruby 時,TextMate 會準備好使用目前的二進位檔執行。只要注意切換到非你正在進行的主要專案的專案目錄的副作用,因為 TextMate 的 Ruby 環境會相應地變更!
確保 TextMate 是最新的
接下來,讓你的 textmate 是最新版本,並執行以下腳本更新你所有的套件
#!/usr/bin/env bash mkdir -p /Library/Application\ Support/TextMate/ sudo chown -R $(whoami) /Library/Application\ Support/TextMate cd /Library/Application\ Support/TextMate/ if [[ -d Bundles/.svn ]] ; then cd Bundles && svn up else if [[ -d Bundles ]] ; then mv Bundles Bundles.old fi svn co http://svn.textmate.org/trunk/Bundles fi exit 0
備註
若要變更 TM_RUBY shell 變數,在 TextMate 中使用選單導覽至
Textmate | Preferences | Advanced | Shell Variables
如果你遇到問題,你可能需要在 TextMate 中變更 bundler Builder.rb。由於 TextMate 會使用它自己的 builder,因此透過移除它,我們可以使用如上所述的 TM_RUBY(感謝 Seivan Heidari!)
cd /Applications/TextMate.app/Contents/SharedSupport/Support/lib/ ; mv Builder.rb Builder.rb.backup
如果你需要更新 osx-plist 以相容 Ruby 1.9.X,這可能會有些用處
git clone git://github.com/kballard/osx-plist.git cd osx-plist/ext/plist ruby extconf.rb && make cp plist.bundle /Applications/TextMate.app/Contents/SharedSupport/Support/lib/osx/
如果您遇到 Ruby 1.9+ 的問題,即
ruby:0:in `require': /Users/someuserhere/Library/Application Support/TextMate/Bundles/Ruby.tmbundle/Support/RubyMate/catch_exception.rb:13: invalid multibyte char (US-ASCII) (SyntaxError)
您需要檢查套件的更新版本,或手動編輯有問題的文件,在文件開頭加入以下內容
# encoding: utf-8
這會強制 Ruby 以正確的文字編碼讀取文件,允許多位元組字元。另一種解決方案是讓 ruby 1.9.X 在透過 textmate_ruby 呼叫時,始終以 UTF-8 模式執行。為此,請編輯 textmate_ruby 文件並取代包含以下內容的行
exec ruby "$@"
使用包含以下內容的新行
exec ruby -wKU "$@"
其他
您可以建立一個 shell 函數,以開啟排除檔案的專案目錄。以下是這個概念的簡單範例
上述函數程式碼(減去第一行)會放在您的 dotfiles 或 ~/.bash_profile 中,如果您沒有維護 dotfiles 的話。