sublime text 默认不识别 scheme 文件,需手动绑定语法、配置repl和构建系统:将.scm/.ss关联lisp语法,用sublimerepl启动racket等scheme解释器,新建scheme.build运行脚本,并修改lisp.sublime-syntax适配scheme特性。

Sublime Text 默认不识别 Scheme 文件,打开 .scm 或 .ss 就是 Plain Text,括号不配对、关键词不着色、Ctrl+Enter 无响应——这不是插件没装,而是语法没绑定、解释器没连上、构建系统没配。
为什么 .scm 文件打开还是 Plain Text
Sublime 不靠文件内容判断语言,只认后缀 + 手动语法激活。即使你装了 Lisp 插件,它默认也不处理 .scm 或 .ss;官方 Lisp 语法包只绑定 .lisp 和 .lsp。
- 右下角点击当前语言名(显示
Plain Text),选Open all with current extension as…→Lisp - 更彻底:打开
Preferences → Browse Packages… → User,新建Lisp.sublime-syntax,复制官方 Lisp 语法定义,在file_extensions列表末尾加两行:- scm、- ss - 别依赖
detect_indentation:Scheme 对缩进敏感,但 Sublime 容易误判老文件里的混合空格/tab,建议在Preferences → Settings – Syntax Specific(确保当前是 Lisp 语法)里设:"detect_indentation": false
Ctrl+Enter 发送代码到 REPL 总是失败
这个快捷键本质是「把光标所在闭合 S-表达式发给已运行的 REPL 进程」,不是本地求值。三个条件缺一不可:语法是 Lisp、光标落在完整表达式内、REPL 已启动且路径正确。
- 确认语法:按
Ctrl+Shift+P→ 输入Set Syntax: Lisp,别选Clojure或Scheme(Sublime 没原生 Scheme 语法) - 检查光标位置:停在
(define (fib n) (if ( 任意位置可发;停在 <code>(define (fib n)这种半截上,只会发前半段,REPL 报错unexpected EOF - REPL 必须手动启动:按
Ctrl+Shift+P→SublimeREPL: Common Lisp;如果报Unable to find sbcl,打开Preferences → Package Settings → SublimeREPL → Settings – User,硬写死路径,例如:"sbcl_path": "/usr/local/bin/racket"(注意:Racket 是 Scheme 实现之一,sbcl是 Common Lisp 的,别混用)
Build System 运行 .scm 文件一闪而过
Sublime 的 Ctrl+B 启动的是短命子进程,输出完立刻关闭窗口。Scheme 解释器(如 racket、chicken-csi)若未显式退出,或脚本里有顶层 (display "x") 而没跟 (exit),你就只能看到黑框闪一下。
- 推荐用
racket:它原生支持--script模式,新建Tools → Build System → New Build System…,粘贴:
{
"cmd": ["racket", "--script", "$file"],
"selector": "source.lisp",
"working_dir": "$file_path",
"file_regex": "^([^:]+):([0-9]+):([0-9]+): (.+)$"
}
- 保存为
Scheme.sublime-build(自动存进Packages/User/);务必先Ctrl+S保存你的.scm文件,否则$file为空字符串,构建直接崩溃 - 如果用
chicken-csi,不能直接chicken-csi $file,得包装成:["sh", "-c", "echo '(load \"$file\") (exit)' | chicken-csi -s"],否则交互式环境卡住不退出
括号匹配和缩进看起来“错位”
Scheme 缩进不像 Common Lisp 那样依赖 defun 等宏,而是靠语义结构(define、lambda、let 等)驱动;Sublime 默认 Lisp 语法的缩进规则对 Scheme 支持有限,容易在嵌套 cond 或 let* 里错行。
- 不要开
auto_indent或smart_indent:它们会干扰 Scheme 社区约定的 2 空格缩进 - 在
Preferences → Settings – Syntax Specific(当前语法为 Lisp)里强制设:"tab_size": 2、"translate_tabs_to_spaces": true、"detect_indentation": false - 已有文件缩进混乱?全选 →
Ctrl+Shift+P→Convert Indentation to Spaces,再手动删掉残留 tab(显示为→)
真正容易被忽略的是:Sublime 没有原生 Scheme 语法包,所有高亮和缩进都借用了 Lisp 的底层规则;一旦遇到 R6RS/R7RS 特有语法(如 import、library),高亮就会失效——这时候就得自己改 Lisp.sublime-syntax,加 scope 映射,而不是换插件。











