Emacs为R语言配置lsp-mode的方法及启动报错解决方案
问题根因
触发File mode specification error: (void-function -compose)报错的核心原因是lsp-mode依赖的dash.el工具库版本过低:-compose是dash 2.19.0及以上版本才提供的函数,当包管理器未同步更新依赖、或本地存在手动加载的旧版dash文件时,就会触发该错误,与R环境、ESS组件本身的安装无关。
修复步骤
- 升级Emacs包依赖:执行
M-x list-packages进入包管理界面,按U标记所有可升级包,再按x确认执行升级,重点确认dash、lsp-mode、ESS三个包升级到最新稳定版,升级完成后重启Emacs,先验证报错是否消失。 - 排查冗余本地配置:如果升级包后仍报错,检查init.el中是否存在手动将本地旧版dash仓库路径加入
load-path的配置,删除相关冗余项即可。在*scratch*缓冲区执行(dash-version)查看当前加载的dash版本,返回值低于2.19.0即可确认是版本不匹配问题。 - 替换lsp集成配置:补全
lsp-ui、company-mode、which-key的配套集成逻辑,将原有lsp-mode配置块替换为以下内容,确保三个配套组件已经提前通过包管理器安装:
(use-package company :hook (after-init . global-company-mode) :config (setq company-minimum-prefix-length 1 company-idle-delay 0.2)) (use-package lsp-ui :commands lsp-ui-mode :config (setq lsp-ui-doc-position 'bottom lsp-ui-sideline-enable nil)) (use-package lsp-mode :init (setq lsp-keymap-prefix "C-c l" lsp-auto-guess-root t lsp-enable-snippet t lsp-prefer-capf t) :hook ((ess-r-mode . lsp) (lsp-mode . lsp-enable-which-key-integration) (lsp-mode . company-mode)) :commands lsp)
- 验证服务可用性:重启Emacs后打开任意
.R后缀的脚本文件,执行M-x lsp-describe-session,如果缓冲区中能显示R language server的运行进程,即代表配置生效,代码补全、语法检查、定义跳转、which-key快捷键提示功能均可正常使用。
注意事项
无需按照旧教程手动添加
lsp-deferred延迟加载钩子,新版lsp-mode已经默认处理了ESS模式下的加载时序,手动添加反而可能触发加载顺序冲突。在R控制台执行install.packages("languageserver")将R端的语言服务包升级到最新版,避免服务端与客户端版本不兼容导致的功能异常。
内容的提问来源于stack exchange,提问作者cdd
相关产品推荐
相关产品推荐

