保存elisp文件会打乱elisp代码

如题,使用C-x C-s 或者用 evil 的 “:w” 保存 elisp 文件,会导致 elisp 代码被打乱。

有人碰到过这种问题吗?不确定是不是 emacs 的问题,因为不是每次编辑 elisp 文件都会这样。OS 是 Mac Monterey,Emacs 是 EmacsForMacOS 27.2-3。

试试 C-h v after-save-hook ,看看 after-save-hook 上绑定了些什么?

很早就有类似的问题,不过我也不知道咋解决

nil

我没用鼠标,打乱的代码里只是被插入了空格和换行。而且只是前面一些行,不是整个文件。

本来是这样的:

(global-hl-line-mode t)
(setq inhibit-startup-message t)
(scroll-bar-mode -1) ;; Disable visible scrollbar
(tool-bar-mode -1) ;; Disable the toolbar
(tooltip-mode -1) ;; Disable tooltips
(set-fringe-mode 10);;Give some breathing room
(menu-bar-mode 1);; Disable the menu bar

(setq-default cursor-type 'bar)

(column-number-mode t)
(global-display-line-numbers-mode t)

;; Disable line numbers for some modes
(dolist (mode '(org-mode-hook
		term-mode-hook
		shell-mode-hook
		treemacs-mode-hook
		eshell-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))

(setq display-line-numbers-type t) ;;t(means absolute), relative, visual

;; auto pair
(use-package electric-pair-mode
  :ensure nil
  :hook (prog-mode . electric-pair-mode)
  )

(use-package paren ;; show paren mode
  :ensure nil ;; builtin emacs and enabled by default
  :custom
  (setq show-paren-when-point-inside-paren t)
  (setq show-paren-style 'mixed)
  )

保存之后变成这样了:

(global - hl - line - mode t)(setq inhibit - startup - message t)(scroll - bar -
                                                                  mode - 1);
;
Disable visible scrollbar(tool - bar - mode - 1);
;
Disable the toolbar(tooltip - mode - 1);
;
Disable tooltips(set - fringe - mode 10);
;
Give some breathing room(menu - bar - mode 1);
; Disable the menu bar

(setq-default cursor-type 'bar)

(column-number-mode t)
(global-display-line-numbers-mode t)

;; Disable line numbers for some modes
(dolist (mode '(org-mode-hook
		term-mode-hook
		shell-mode-hook
		treemacs-mode-hook
		eshell-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))

(setq display-line-numbers-type t) ;
;
t(means absolute), relative, visual

    ;
; auto pair
(use-package electric-pair-mode
  :ensure nil
  :hook (prog-mode . electric-pair-mode)
  )

(use-package paren ;; show paren mode
  :ensure nil ;; builtin emacs and enabled by default
  :custom
  (setq show-paren-when-point-inside-paren t)
  (setq show-paren-style 'mixed)
  )

;; auto pair 后面又都是正常的。

不知道你是什么配置? 先试试 emacs -q 会不会有问题,如果没问题的话,可以试试对配置采用二分法排查看看是哪个包引起的bug。

emacs -q 可以正常启动,如果把配置文件修改正确,GUI 启动也一切正常。头疼的是这个问题不好复现,不是每次编辑文件都会这样,而是打开 emacs 一段时间后会出现这种情况。而且好像不只是 elisp,之前编辑一个 makefile 文件的时候也出现了这种情况。

把配置注释掉一半用用看有没问题,如果有问题,再注释掉一半,这样缩小范围,就能锁定引起问题的包了。(在没方向的时候这个比较笨的办法有时是最有效的😄)