如何在Emacs中临时全局禁用flycheck/prettier等模式?
问题
我常用rgrep查找需要修改的文件,再通过宏遍历这些文件完成修改并保存。这个流程很便捷,但存在问题:保存文件时prettier会自动检查格式化每个文件,flycheck(基于eslint)也会占用大量CPU资源。
我想知道有没有合适的方法可以临时全局禁用某些模式(尤其是flycheck)?我的宏会访问大量文件,且完成后仍需正常使用这些模式。
编辑补充:以下是我在rjsx-mode中加载flycheck的配置:
;; disable jshint since we prefer eslint checking (setq-default flycheck-disabled-checkers (append flycheck-disabled-checkers '(javascript-jshint))) ;; disable json-jsonlist checking for json files (setq-default flycheck-disabled-checkers (append flycheck-disabled-checkers '(json-jsonlist))) ;; use eslint with web-mode for jsx files (defun my/use-eslint-from-node-modules () (let* ((root (locate-dominating-file (or (buffer-file-name) default-directory) "node_modules")) (eslint (and root (expand-file-name "node_modules/eslint/bin/eslint.js" root)))) (when (and eslint (file-executable-p eslint)) (setq-local flycheck-javascript-eslint-executable eslint)))) (add-hook 'flycheck-mode-hook #'my/use-eslint-from-node-modules) (flycheck-add-mode 'javascript-eslint 'rjsx-mode)
实现思路与解决方案
针对批量文件修改时临时禁用flycheck和prettier的需求,有以下几种可靠的实现思路:
1. 用宏包裹「禁用-执行任务-恢复」流程
直接在批量处理逻辑前后添加禁用和恢复代码,确保任务完成后自动回归原有配置,适合录制宏后手动编辑宏代码的场景:
(defun my/batch-modify-files () ;; 保存原有模式状态 (let ((original-flycheck-state flycheck-global-mode) (original-prettier-state prettier-mode)) ;; 临时禁用目标模式 (when flycheck-global-mode (flycheck-mode -1) (setq flycheck-global-mode nil)) (when prettier-mode (prettier-mode -1)) ;; 这里放入你原本的批量修改逻辑(比如遍历rgrep结果的代码) ;; ... ;; 恢复原有模式状态 (when original-flycheck-state (flycheck-mode 1) (setq flycheck-global-mode t)) (when original-prettier-state (prettier-mode 1))))
2. 临时关闭flycheck自动检查触发
如果不想完全禁用flycheck模式,只是避免批量修改时的自动检查,可以修改触发条件:
(defun my/toggle-flycheck-save-check () (interactive) (if (memq 'save flycheck-check-syntax-automatically) (setq flycheck-check-syntax-automatically (remove 'save flycheck-check-syntax-automatically)) (add-to-list 'flycheck-check-syntax-automatically 'save)))
批量处理前调用M-x my/toggle-flycheck-save-check关闭保存时的自动检查,处理完成后再次调用恢复即可。
3. 全局禁用flycheck检查器
不需要关闭flycheck模式本身,仅让它停止执行检查任务,适合需要保留模式界面但降低CPU占用的场景:
;; 临时全局禁用所有检查器 (setq flycheck-disabled-checkers '(all)) ;; 批量处理完成后恢复原有配置 (setq flycheck-disabled-checkers '(javascript-jshint json-jsonlist))
4. 临时禁用prettier自动格式化
如果prettier通过prettier-mode启用,除了直接关闭模式,还可以单独禁用保存时的自动格式化:
;; 临时禁用自动格式化 (setq prettier-mode-auto-format nil) ;; 处理完成后恢复 (setq prettier-mode-auto-format t)
或者临时移除before-save-hook中的prettier钩子:
(let ((original-hook before-save-hook)) (setq before-save-hook (remove 'prettier-before-save before-save-hook)) ;; 执行批量修改逻辑 ;; ... (setq before-save-hook original-hook))
内容的提问来源于stack exchange,提问作者user3637541
相关产品推荐
相关产品推荐

