支持
RVM 由志愿者社区维护,请将问题报告到 RVM 问题追踪器。
如果您能提供帮助或希望成为维护者之一 - 请开始帮助我们。 您可以在 RVM Github 组织 中找到更多与 RVM 相关的项目。
赞助商
Carbon Ads

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 之前执行以下步骤

  1. 加载 RVM
  2. 查找任何 RVMRC 文件并加载它们
  3. 作为普通 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 设置生效。

测试你的包装器

你现在可以通过以下步骤测试它是否正常工作

  1. 打开一个新文档
  2. 将此代码放入新文档中
    puts RUBY_DESCRIPTION
    
  3. 将文件保存为 'ruby_test.rb'
  4. 按 Command + R 运行 ruby
如果你看到类似 "ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.2.0]" 的内容,最重要的是 'ruby 1.9.1' 部分,那么它按预期工作。

当你希望切换 TextMate 默认使用的 ruby 版本时,你可以更改你的默认 RVM ruby 版本,如下所示

$ rvm use rbx@rails3 --default
RVM 也会根据每个项目的 .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 中。