Emacs桌面保存模式错误

时间:2013-09-04 11:35:10

标签: emacs emacs24

我不清楚这应该在这里还是在超级用户中,但是这里就是。

我正在尝试将Desk Top包与最新的Emacs一起使用。我已将(桌面保存模式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()

3 个答案:

答案 0 :(得分:8)

我有同样的问题。我设法通过设置

来修复它
(setq desktop-restore-frames t)
(setq desktop-restore-in-current-display t)
(setq desktop-restore-forces-onscreen nil)

在我的init.el

答案 1 :(得分:3)

在初始文件中将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返回的left值的frame-monitor-onscreen值(否则frame-monitor-onscreen本身不会返回nil 1}}作为第一个列表元素)。 Emacs Dev很乐意收到您的错误报告。

答案 2 :(得分:0)

免责声明:我必须承认我并不了解Emacs。我还必须承认我根本不懂LISP。因此,我发现这个问题供我个人使用的解决方案可能都非常无知,并且很可能产生不可预测的结果。

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

有效地,我使用上面的答案来确定问题区域。然后我在frameset.el.gz中注释掉了以下行(1005):

(frameset-move-onscreen frame force-onscreen)

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

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