Emacs桌面保存模式错误

4
我不确定这个问题应该放在这里还是放在superuser,但是我会尝试解答。
我试图在最新的Emacs中使用Desk Top包。我已经在我的.emacs文件中添加了(desktop-save-mode 1),但是当我启动Emacs时,我现在遇到了以下错误。
Error (frameset): Wrong type argument: number-or-marker-p, nil

我有点不知道从哪里开始调试,而且谷歌也没有帮助。

有什么想法吗?

如请求所示,添加堆栈跟踪信息

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
   2   +(nil 80 -1)
   3   frameset-move-onscreen(#<frame F1 0xb53310> t)
   4   frameset--restore-frame(((tty-type . "xterm-256color") (tty . "/dev/tty") (display-type . color) (background-mode . dark) (foreground-color . "#808080") (cursor-color . "#808080") (background-col$
   5   #[0 "\307\306@\236A\211A^A@\205^M^@\211\310\302!\203^[^@\302\306@\305\"\202^\^@\302\311\211\312^C!\203*^@\311^V \202J^@\313\311\314\"\314\306@\236A=\203=^@\311^V \202J^@\314\313\311\314\"B\211^V $
   6   funcall(#[0 "\307\306@\236A\211A^A@\205^M^@\211\310\302!\203^[^@\302\306@\305\"\202^\^@\302\311\211\312^C!\203*^@\311^V \202J^@\313\311\314\"\314\306@\236A=\203=^@\311^V \202J^@\314\313\311\314\"$
   7   frameset-restore([frameset 1 (21031 10481 847348 292000) (desktop . "206") "shomer@rubydev" nil nil ((((tty-type . "xterm-256color") (tty . "/dev/tty") (display-type . color) (background-mode . d$
   8   (progn (frameset-restore desktop-saved-frameset :reuse-frames desktop-restore-reuses-frames :force-display desktop-restore-in-current-display :force-onscreen desktop-restore-forces-onscreen))
   9   (if (desktop-restoring-frameset-p) (progn (frameset-restore desktop-saved-frameset :reuse-frames desktop-restore-reuses-frames :force-display desktop-restore-in-current-display :force-onscreen de$
  10   desktop-restore-frameset()
  11   (if (and owner (memq desktop-load-locked-desktop (quote (nil ask))) (or (null desktop-load-locked-desktop) (daemonp) (not (y-or-n-p (format "Warning: desktop file appears to be in use by PID %s.\$
  12   (let ((desktop-first-buffer nil) (desktop-buffer-ok-count 0) (desktop-buffer-fail-count 0) (owner (desktop-owner)) (desktop-save nil)) (if (and owner (memq desktop-load-locked-desktop (quote (nil$
  13   (if (file-exists-p (desktop-full-file-name)) (let ((desktop-first-buffer nil) (desktop-buffer-ok-count 0) (desktop-buffer-fail-count 0) (owner (desktop-owner)) (desktop-save nil)) (if (and owner $
  14   (if noninteractive nil (setq desktop-dirname (file-name-as-directory (expand-file-name (or (and (< 0 (length dirname)) dirname) (let ((dirs desktop-path)) (while (and dirs ...) (setq dirs ...)) ($
  15   desktop-read()
  16   (progn (desktop-read) (desktop-auto-save-set-timer) (setq inhibit-startup-screen t))
  17   (if desktop-save-mode (progn (desktop-read) (desktop-auto-save-set-timer) (setq inhibit-startup-screen t)))
  18   (closure (auto-insert desktop-buffer-locals desktop-buffer-major-mode desktop-buffer-fail-count desktop-buffer-ok-count desktop-first-buffer t) nil (let ((key "--no-desktop")) (if (member key com$
  19   run-hooks(after-init-hook)
  20   command-line()
  21   normal-top-level()

尝试运行以下命令: echo "(desktop-save-mode 1)" > test.el && emacs -q -l test.el - abo-abo
或者 emacs -q --eval "(desktop-save-mode 1)" - Nicolas Dudebout
嗯,奇怪 - 当我这样做时没有错误消息,但是如果我清除.emacs文件只包括(desktop-save-mode 1),我仍然会收到错误... - Steve Homer
2
尝试删除旧的桌面文件,让它在下次打开Emacs时创建一个新文件,以消除可能的问题。默认情况是恢复框架,所以你可能在设置文件的其他地方有一个框架或其他一些东西,造成了冲突。为了关闭恢复框架并帮助寻找根本原因,请尝试添加:(setq desktop-restore-frames nil) - lawlist
3个回答

9

我有同样的问题。我通过设置来解决它

(setq desktop-restore-frames t)
(setq desktop-restore-in-current-display t)
(setq desktop-restore-forces-onscreen nil)

在我的init.el文件中

2
具体来说,是(setq desktop-restore-forces-onscreen nil)这一行解决了这个问题。 - Kaushal Modi

4
在您的初始化文件中将debug-on-error设置为t。重命名或删除字节编译文件desktop.elc,以便加载源文件desktop.el - 这将为您提供更好的调试回溯。

当错误被触发时,调试器(缓冲区* Backtrace *)将显示回溯。这将提供更多关于导致错误的信息,在这种情况下是因为frameset期望数字或标记,而收到了nil

此外,请确保更新Emacs,如果您正在使用开发快照,因为frameset.el代码仍在开发中(它是全新的)。您可以在此处显示您的回溯。可能有frameset.el中需要报告的错误。如果是这样,请尝试先进行一些调查。M-x report-emacs-bug是报告错误的方法。


在回溯之后---

请通过M-x report-emacs-bug报告此问题。 frameset-move-onscreen中的代码是问题所在:

 (pcase-let* ((`(,left ,top ,width ,height) (cl-cdadr (frame-monitor-attributes frame)))
              (right (+ left width -1))
               ...

在您的情况下(这并不是非典型的),(frame-monitor-attributes frame)返回一个列表,其第一个元素为nil,并绑定到left。下一个绑定尝试将right绑定到(+ nil ...),这会引发错误。 frameset.el代码无法处理由frame-monitor-onscreen返回的left值的nil值(或者frame-monitor-onscreen本身不应将nil作为第一个列表元素返回)。Emacs Dev很乐意收到您的错误报告。

谢谢 - 我已经将回溯信息添加到上面的问题中了。我遇到这个问题已经几周了,并且一直在定期更新 Git 看是否是开发问题,但是到目前为止还没有任何改变。 - Steve Homer

0
免责声明:我必须承认我不太了解Emacs。我还必须承认我根本不懂LISP。因此,我为自己的个人使用找到的解决方案可能非常无知,并且很可能会产生不可预测的结果。
我正在使用urxvt终端,这似乎是问题的根源。Emacs的GUI版本在这方面没有给我带来任何问题。
实际上,我使用上面的答案来确定问题区域。然后我在frameset.el.gz中注释掉了以下行(1005)。
(frameset-move-onscreen frame force-onscreen)

我在Emacs中对文件进行了字节编译。现在它完全符合我的要求,而且我还没有遇到(不可避免的)副作用。

我尝试这样做的唯一原因是,这个特定函数所试图实现的目标似乎与我的系统不太相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接