emacs - 为什么 ido-mode 试图使用这个变量?

标签 emacs lisp elisp ido

我有 emacs 自动保存和备份到我的主目录中的单个目录。出于某种原因,当我尝试退出我设置保存目录的变量名时,它会传递给 ido-mode,它不会让我退出 emacs。我曾尝试删除旧版本的 ido.last 文件(以及符号链接(symbolic link) .#ido.last),但这似乎并不能始终如一地解决问题。我拥有文件存储目录和文件本身的完全权限和所有权。这发生在我工作的几个系统上,涵盖 emacs 主要版本 21、22 和 24。

以下是我的 emacs 配置的相关部分:

(defvar home (concat (getenv "HOME") "/"))
(defvar emacs-dir (concat home ".emacs.d/"))
(defvar savedir (concat home ".saves/"))

(setq backup-directory-alist `((".*" . savedir)))
(setq auto-save-file-name-transforms `((".*" ,savedir t)))
(setq backup-by-copying t)
(setq delete-old-versions t
      kept-new-versions 10
      kept-old-versions 6
      version-control t)

(setq ido-save-directory-list-file (concat emacs-dir "cache/ido.last"))
(ido-mode t)
(setq ido-enable-flex-matching t
      ido-everywhere t)

这是问题发生时调试器输出的样子。

Debugger entered--Lisp error: (wrong-type-argument stringp savedir)
  expand-file-name(savedir "/home/pinyaka/.emacs.d/cache/")
  make-backup-file-name-1("/home/pinyaka/.emacs.d/cache/ido.last")
  make-backup-file-name("/home/pinyaka/.emacs.d/cache/ido.last")
  find-backup-file-name("/home/pinyaka/.emacs.d/cache/ido.last")
  backup-buffer()
  basic-save-buffer-2()
  basic-save-buffer-1()
  basic-save-buffer()
  save-buffer()
  write-file("/home/pinyaka/.emacs.d/cache/ido.last" nil)
  ido-save-history()
  ido-kill-emacs-hook()
  run-hooks(kill-emacs-hook)
  kill-emacs()
  save-buffers-kill-emacs(nil)
  call-interactively(save-buffers-kill-emacs)

您可以看到,出于某种原因,ido 已经获取了 savedir,即使我从未使用过与 ido-mode 相关的那个变量(我在任何地方都包含了使用该变量的地方)正如我所做的所有 ido 调用一样)。为什么 ido 会对 savedir 做任何事情?

最佳答案

我认为问题是:

(setq backup-directory-alist `((".*" . savedir)))

应该是

(setq backup-directory-alist `((".*" . ,savedir)))

说明:当 Emacs 退出时,Ido 正在尝试保存它的历史; Emacs 的标准备份程序启动并尝试备份该文件。但是,您忘记在 backup-directory-alist 的配置中取消对 savedir 的引用,因此 cons 单元格是一对字符串和符号,而不是预期的一对字符串。

关于emacs - 为什么 ido-mode 试图使用这个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22394593/

相关文章:

emacs - 更改 Common Lisp REPL 中文本的颜色

lisp - '(()) 和 (cons null null) 之间的区别

lisp - 确定父类(super class)型路径

emacs - 需要一个 Elisp 函数来推回输入

emacs - 使用 ido 的组织重新文件,不使用 ido 作为完成引擎

regex - 如何在 Emacs 中灰显 "//comment"行?

html - 使用 Emacs 将纯文本文件转换为 HTML。如何添加结束标签?

emacs - 如何在 Emacs Lisp 函数中等待事件?

Emacs 启动时出现 24 错误

emacs - 无需鼠标的 Flyspell