Doom Emacs如何配置StandardJs接入format-all实现保存自动格式化?
Doom Emacs 集成 standard-js 格式化器正确配置方法
之前配置失效的原因
- 直接复用format-all原生的
define-format-all-formatter代码无效:Doom的editor/format模块对format-all做了上层封装,原生定义方法不会被模块的加载逻辑识别,写在config.el中不会生效。 - 自定义
set-formatter!配置无效有三个核心问题:- 缺少
--stdin参数:standard默认读取磁盘文件,不会从标准输入读取Emacs当前缓冲区的内容,导致程序执行时无输入源,直接挂起或退出。 - 没有配置合法退出码:standard执行后如果存在lint警告(非语法错误)会返回退出码1,Doom默认将非0退出码判定为格式化执行失败,会直接丢弃格式化结果。
- 没有配置语法错误匹配规则:无法正确识别格式化过程中出现的语法错误,报错信息不会正常反馈。
- 没有适配web-mode的内容类型判断:web-mode会承载多种类型的前端文件,直接绑定会在html/css等非js内容下错误调用standard。
- 缺少
正确配置步骤
- 首先全局安装standard依赖:
npm install --global standard
- 在
~/.doom.d/config.el中添加如下配置(确保你已经在init.el的doom模块声明中启用了:editor format模块):
;; 注册standard格式化器 (set-formatter! 'standard "standard --fix --stdin" :modes '(js-mode js2-mode js3-mode js2-jsx-mode jsx-mode rjsx-mode react-mode) :ok-statuses '(0 1) :error-regexp ".*?:.*?:[0-9]+:[0-9]+: Parsing error:") ;; 适配web-mode,仅在js/jsx内容类型下使用standard (add-hook! 'web-mode-hook (defun +web-mode-bind-standard-formatter-h () (when (member web-mode-content-type '("javascript" "jsx")) (setq-hook! 'web-mode-hook +format-with 'standard))))
- 打开终端执行
doom sync同步配置,之后重启Emacs即可生效。
可选配置
- 如果需要开启对应模式的保存自动格式化,添加如下配置:
(after! format (pushnew! +format-on-save-enabled-modes 'js-mode 'js2-mode 'rjsx-mode 'web-mode))
- 如果之前给js类模式绑定过prettier作为格式化器,记得从prettier的
:modes列表中移除js相关模式,避免格式化器冲突。
验证方法
打开任意js文件,执行M-x +format/buffer,文件内容被正常格式化、无报错即代表配置生效。
内容的提问来源于stack exchange,提问作者Ceintu
相关产品推荐
相关产品推荐

