Почему ido-mode пытается использовать эту переменную?

У меня есть автоматическое сохранение и резервное копирование emacs в один каталог в моем домашнем каталоге. По какой-то причине, когда я пытаюсь выйти, имя переменной, в которой я установил каталог сохранения, переходит в режим ido, и это не позволяет мне выйти из emacs. Я попытался удалить старые версии своего файла ido.last (и символическую ссылку. # 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 что-то делает с saveir?


person William Everett    schedule 14.03.2014    source источник


Ответы (1)


Думаю, проблема в следующем:

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

Должно быть

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

Объяснение: Когда Emacs завершается, Ido пытается сохранить свою историю; срабатывает стандартная процедура резервного копирования Emacs и пытается создать резервную копию этого файла. Однако вы забыли убрать кавычки savedir в конфигурации для backup-directory-alist, поэтому cons-ячейка представляет собой пару строки и символа, а не пару строк, как ожидалось.

person tungd    schedule 14.03.2014
comment
Неважно. Внутри аргумента, заключенного в обратные кавычки, запятая перед ним указывает, что это переменная. gnu.org/software/emacs/manual/html_node/elisp/ Backquote.html - person William Everett; 14.03.2014