Ctrl+B无反应是因为Sublime未将文件识别为Ruby:需确保状态栏显示“Ruby”、文件已保存、手动选中Ruby构建系统,并配置正确的source.ruby selector和shell_cmd路径。

Sublime Text 本身不运行 Ruby,它只是调用系统里的 ruby 命令;配错路径、没设 selector、文件未保存或权限不对,都会导致 Ctrl+B 静默失败或报 “command not found”。
为什么 Ctrl+B 运行 Ruby 脚本没反应?
不是 Ruby 没装好,而是 Sublime 根本没把当前文件当 Ruby 处理。它只认后缀 + 语法类型 + 构建系统三者匹配才触发构建。
- 右下角状态栏显示的是
Plain Text或Ruby?必须是Ruby(不是Ruby on Rails或其他变体),否则selector不生效 - 文件是否已保存?
$file变量在未保存的缓冲区里为空,构建直接跳过,毫无提示 - 是否手动选过构建系统?即使配置了
selector,首次使用仍需通过Tools → Build System → Ruby点一次,否则默认可能走Automatic - JSON 格式有硬伤?一个逗号错位会让整个
Packages/User/下的构建系统失效,建议粘贴到 jsonlint.com 快速校验
怎么写一个真正能跑的 Ruby.sublime-build?
别抄网上用 sh -c "ruby $file" 的旧配置——绕过 shebang、不继承 shell 环境、信号无法透传(Ctrl+C 无效)。最简可靠写法如下:
{
"shell_cmd": "ruby -W -I "$file_path" "$file"",
"file_regex": "^([^:]+):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "$file_path",
"selector": "source.ruby"
}
-
ruby -W启用警告,避免隐式错误被忽略 -
-I "$file_path"把当前目录加进$LOAD_PATH,解决require './lib'类相对路径加载失败 -
shell_cmd比cmd更适合 Ruby:自动处理空格路径,且能正确转发环境变量(如GEM_HOME) -
selector必须是source.ruby—— 这是 Sublime 官方 Ruby 语法插件定义的作用域,不是source.ruby-on-rails
Ruby 版本和 gem 环境总出问题?
Build System 默认不读 ~/.zshrc、不激活 rbenv 或 rvm,更不会自动进项目 .ruby-version。所谓“找不到 gem”或“wrong ruby version”,95% 是解释器路径没对上。
- 终端里运行
which ruby,把输出的完整路径写死进shell_cmd,比如:/Users/you/.rbenv/shims/ruby -W "$file" - 用 rbenv?确保
rbenv init已注入 shell,且 Sublime 是从终端启动(subl .),否则 shims 不生效 - 项目用了 bundler?别指望
bundle exec ruby自动工作,得显式写进构建:shell_cmd: "cd '$file_path' && bundle exec ruby '$file'" - Windows 用户注意:
shell_cmd在 Windows 上会被忽略,必须改用cmd字段,并写双反斜杠路径,例如:["C:\Ruby31-x64\bin\ruby.exe", "-W", "$file"]
输出一闪而过,或者 input() 卡住?
Sublime 的构建面板不是终端,它没有伪终端(pty)支持,所以 Ruby 的 gets、STDIN.gets 会阻塞,而脚本退出后输出又立刻清屏。
- 交互式脚本请勿在构建面板运行,改用外部终端:在构建配置里加
variants,例如:
"variants": [
{
"name": "Run in Terminal",
"shell_cmd": "open -a Terminal.app '$file_path' 2>/dev/null || gnome-terminal --working-directory='$file_path' -e 'bash -c "ruby $file; read -p \"Press enter to continue...\"; exec bash"' 2>/dev/null"
}
]
- 非交互脚本想看完整输出?按
Ctrl+Shift+B(Windows/Linux)或Cmd+Shift+B(macOS)打开 Build Results 面板,错误和 stdout 全部保留,可复制可搜索 - 别加
& pause或; read到shell_cmd—— macOS/Linux 下不可靠,Windows 下又破坏跨平台性
真正容易被忽略的是:Ruby 构建系统不继承你的 shell 环境变量,也不自动切换 gemset;每次以为是代码问题,其实只是 ruby 命令指向了系统自带的老版本。

















