enh-ruby-mode不支持Ruby3.1哈希字面量值省略语法如何解决
问题
据我观察,enh-ruby-mode目前似乎不支持Ruby 3.1的最新语法特性,具体为“哈希字面量值省略”语法。
是否有可行的解决方案?

相关环境信息:
- 使用rbenv管理Ruby环境
enh-ruby-program配置项的值为"~/.rbenv/shims/ruby"- 当前使用的Ruby版本为3.1.2
- 对出现语法误报的同一份文件执行
ruby -c path/to/file命令,输出结果为Syntax OK,可确认文件本身语法合法 - 当前安装的
enh-ruby-mode插件版本为20210120.201 - 目前仅能通过在Ruby 3.1项目中配置
enh-ruby-check-syntax参数作为临时规避方案。
回答
误报本质是版本兼容问题:当前安装的enh-ruby-mode是2021年1月的快照版本,发布时间早于Ruby 3.1正式版,模式内置的elisp语法解析规则没有覆盖Ruby 3.1新增的哈希字面量值省略语法,才会把合法语法标记为错误。enh-ruby-program配置仅负责调用外部Ruby解释器执行代码,不会替换模式内置的语法解析逻辑,所以哪怕本地指向的是Ruby 3.1解释器,内置规则不更新也会出现误报。
可行的解决方法按优先级排序如下:
- 升级enh-ruby-mode到MELPA最新快照版本。目前最新开发版已经合入Ruby 3.1、3.2系列的语法支持补丁,升级后重启Emacs即可自动识别哈希简写语法,不需要额外修改配置。如果使用
use-package管理插件,确认包源指向MELPA而非MELPA Stable即可拉取最新版本。 - 替换语法检查后端为Ruby语言服务器。如果不想依赖enh-ruby-mode的内置解析,可以搭配eglot/lsp-mode使用
ruby-lsp作为后端,这类专门的语言服务器对Ruby新语法的跟进速度远快于enh-ruby-mode自带的解析器,除解决当前的哈希简写误报外,后续Ruby 3.2匿名块参数、Ruby 3.3it参数等新语法都能正常识别,不会再出现类似兼容问题。 - 自定义语法检查命令调用本地Ruby解释器。如果既不想升级插件也不想引入LSP,可以修改enh-ruby-mode的语法检查配置,直接调用本地rbenv管理的Ruby 3.1解释器做语法校验,和手动执行
ruby -c的结果完全一致,配置代码如下:
(setq enh-ruby-check-syntax-command (lambda () (concat (expand-file-name "~/.rbenv/shims/ruby") " -c")))
配置生效后会跳过内置的语法规则检查,直接以本地Ruby解释器的校验结果为准,不会再出现误报。
当前使用的关闭enh-ruby-check-syntax的方案会完全禁用语法检查能力,不建议长期使用,优先选择前两种方案即可。
内容的提问来源于stack exchange,提问作者Nikita Fedyashev
相关产品推荐
相关产品推荐

