4

我不清楚这是否应该在这里或超级用户中,但这里有。

我正在尝试将桌面包与最新的 Emacs 一起使用。我已将 (desktop-save-mode 1) 添加到我的 .emacs 中,但是在启动 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()
4

3 回答 3

9

我也有同样的问题。我设法通过设置来修复它

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

在我的 init.el

于 2014-10-24T11:18:17.223 回答
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代码不够健壮,无法处理由返回的nil值的值(否则本身不应作为第一个列表元素返回)。Emacs Dev 将很高兴收到您的错误报告。leftframe-monitor-onscreenframe-monitor-onscreennil

于 2013-09-04T14:37:53.013 回答
0

免责声明:我必须承认我不太了解 Emacs。我还必须承认我根本不了解 LISP。因此,我为自己的个人使用而发现的这个问题的解决方案可能既非常无知,也很可能产生不可预知的结果。

我正在使用 urxvt 终端,这似乎是问题的根源。Emacs 的 GUI 版本在这方面没有给我带来任何问题。

实际上,我使用上述答案来确定问题区域。然后我在 frameset.el.gz 中注释掉以下行 (1005):

(frameset-move-onscreen frame force-onscreen)

我在 Emacs 中对文件进行了字节编译。它现在让我完全满意,我还没有体验到(不可避免的)副作用。

我觉得尝试这个是合理的(除了绝望)的唯一原因是这个特定功能试图实现的目标似乎与我的系统不太相关。

于 2014-04-24T22:44:46.447 回答