我不清楚这应该在这里还是在superuser中,但这里是。
我正在尝试将桌面软件包与最新的Emacs一起使用。我已经在.emacs中添加了(桌面保存模式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 "307306@236A211A^A@205^M^@211310302!203^[^@302306@305"202^^@302311211312^C!203*^@311^V 202J^@313311314"314306@236A=203=^@311^V 202J^@314313311314"B211^V $
6 funcall(#[0 "307306@236A211A^A@205^M^@211310302!203^[^@302306@305"202^^@302311211312^C!203*^@311^V 202J^@313311314"314306@236A=203=^@311^V 202J^@314313311314"$
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()
我也有同样的问题。我设法通过设置来修复它
(setq desktop-restore-frames t)
(setq desktop-restore-in-current-display t)
(setq desktop-restore-forces-onscreen nil)
在我的init.el 中
在初始化文件中将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开发人员将很高兴收到您的错误报告。
我正在使用urxvt终端,这似乎是问题的根源。Emacs的GUI版本在这方面没有给我带来任何问题。
实际上,我使用了上面的答案来确定问题所在。然后我在frameset.el.gz:中注释掉了以下行(1005)
(frameset-move-onscreen frame force-onscreen)
I字节在Emacs中编译了该文件。它现在让我完全满意,我还没有经历(不可避免的)副作用。
我觉得尝试这种方法是合理的(除了绝望),唯一的原因是这个特定功能试图实现的目标似乎与我的系统不太相关。