反馈问题之前请先使用 emacs -Q 排查自己配置的影响

主帖第一张图,“电子邮件……绝不会向公众显示:hushed:

显示自己的当然没问题(

提一下一个emacs 29的小技巧,最近emacs master分支给emacs加入了 --init-directory 选项,例如,可以让用户可以在 ~/emacs-dummy (当然这个路径在哪里叫什么名字都无所谓,随你) 开个新配置,然后用 emacs --init-directory ~/emacs-dummy 启动emacs,emacs就会使用 ~/emacs-dummy 路径下的配置,用来debug非常方便,chemacs2之类的可以退役了。

参考: emacs/NEWS at a03d7630f133d08b457a6d08b9ce2050566800ff · emacs-mirror/emacs · GitHub

6 个赞

如果 debug 配置不是太复杂,不想创建 dummy 目录,可以用我这个脚本:GitHub - twlz0ne/emacsq-sh: Helper script to run `emacs -Q`

直接在命令行上写配置,即用即弃。

4 个赞

另外,如果你使用 Doom 而不使用 Emacs 29,那贴心的 Doom 已经把这个功能 backport 过去了,doom 用户即使在 emacs 27/28 上也可以用 --init-directoryfeat: backport --init-directory for 27/28 users · doomemacs/doomemacs@5108ffc · GitHub

新手总是问一些基本的错误 “遇到错误 xxx, 怎么办?"

我今天给论坛输入框加入了更多提示

为提高大家的交流效率, 请反馈问题之前先自我排查, 以下是排查方法。

排查是否是因为自己配置文件引起的问题:
1. 用 emacs -Q 启动 Emacs
2. 只加载测试插件和最小配置
3. 如果 emacs -Q 启动没有问题,请使用二分注释法排查自己的配置代码

排查Emacs启动时就报错的问题:
1. 用命令 emacs --debug-init 启动Emacs
2. Emacs会在启动时报错告诉你报错位置和调用堆栈
3. 如果第二步看不懂, 请截图Emacs报错到论坛

排查Minibuffer的报错:
1. 请执行 M-x toggle-debug-on-error 命令
2. 再次执行你触发错误的操作, Emacs会告诉你报错位置和调用堆栈
3. 如果第二步看不懂, 请截图Emacs报错到论坛

排查输出消息的命令:
1. 你在Minibuffer看到某种 message 但没有报错, 此时可以通过在 ielm 中执行代码 (setq debug-on-message "xxx")
2. 当Emacs输出 xxx 时,  Emacs 就会启动 debugger ,告诉我们哪行代码输出了消息
3. 通过分析第二步堆栈信息, 你可以定制Emacs的行为, 避免输出不必要的消息

希望定制某个函数的行为, 但却不想改插件源代码, 请善用 advice:
1. 学习连接在 https://www.gnu.org/software/emacs/manual/html_node/elisp/Advising-Functions.html

希望在加载某个模式时执行某些代码, 请善用 hook:
1. 学习连接在 https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html

希望大家求助前先自助, 老手的时间很宝贵。

11 个赞

论坛输入框增加了 profiler-start 和 profiler-report 的用法, 方便告诉那些不知道用这两个命令排查性能问题的新手。

1 个赞

在Minibuffer看到某种 message 但没有报错, 此时可以通过在 ielm 中执行代码 (setq debug-on-message “xxx”)

学到新知识。↑

我排错最常忽略的情况是,配置是对的,但 .elc / .eln 是旧的,以前不懂的时候只能靠运气解决。如果在配置头部加上 (setq load-prefer-newer t) 应该能解决?

捉两个虫:

  1. “rebuilder” → “re-builder”
  2. “interaction-log” 是第三方包,要主动安装。

错误已经更新, 感谢反馈。

1 个赞

(setq load-prefer-newer t) 会有一点点的额外时间消耗,所以我自用的方案是保存时自动重新编译

(defun auto-recompile-file-maybe ()
  (when (and (fboundp 'vc-root-dir)
			 (string= (vc-root-dir) user-emacs-directory))
	(byte-compile-file buffer-file-name)))

(defun add-after-save-hook ()
  (add-hook 'after-save-hook 'auto-recompile-file-maybe nil t))

(add-hook 'emacs-lisp-mode-hook #'add-after-save-hook)
1 个赞

之前使用的 auto-compile 中的 auto-compile-on-save-mode,挺方便的。但我使用 1s 自动保存文件,一保存就会报错。即使修改完了,那个 compile 错误提示框还会一直保留,闹心,暂时关掉了。

我试试你的,多谢分享。

placeholder 其实还包含了更多的内容,但是高度关系有的隐藏了,第一眼看,不注意的话可能会错过一些提示?

(不过可以通过右上角全屏,以及顶部可以将窗口拉高)

大佬,保存后自动编译的方案,如果发生错误会产生一个 Compile-Log,即使修正后这个buffer也不会自动隐藏。如果想让这个buffer 在无错误后自动隐藏,有什么好方案么?


这可能能得分出一个新的贴子讨论,管理员大大们觉得有必要的话,帮我分出一个新贴,感谢。

(defun eli/delete-byte-compile-window-if-success (&rest _arg)
  "Delete byte-compilation window if succeeded without warnings or errors."
  (let ((buf (get-buffer byte-compile-log-buffer)))
	(with-current-buffer buf
	  (unless (re-search-forward "Warning\\|Error" nil t)
		(when-let ((win (get-buffer-window buf)))
		  (delete-window win))))))

(if (native-comp-available-p)
	(advice-add 'native-compile :after #'eli/delete-byte-compile-window-if-success)
  (advice-add 'byte-compile-file :after #'eli/delete-byte-compile-window-if-success))

试试这个

1 个赞

我直接拉了个 emacs -q 的快捷方式到桌面了

因为我用的是你楼上几楼的实现,使用了 byte-compile-file,所以我去掉了判断,直接把 hook 加它身上了:

(advice-add 'byte-compile-file :after #'eli/delete-byte-compile-window-if-success)

好用,谢谢大佬。