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 包装器命令的通用结构是
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 设置生效。
测试你的包装器
你现在可以通过以下步骤测试它是否正常工作
- 打开一个新文档
-
将此代码放入新文档中
puts RUBY_DESCRIPTION
- 将文件保存为 'ruby_test.rb'
- 按 Command + R 运行 ruby
当你希望切换 TextMate 默认使用的 ruby 版本时,你可以更改你的默认 RVM ruby 版本,如下所示
$ rvm use rbx@rails3 --defaultRVM 也会根据每个项目的 .rvmrc 文件切换 ruby 版本和 gemset
自动执行包装器命令
如果你希望 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 将使用它自己的构建器,通过删除它,我们可以使用上面指定的 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 中,如果您没有维护 dotfiles,则可以放在 ~/.bash_profile 中。