0

ホームディレクトリの単一のディレクトリにemacsの自動保存とバックアップを行っています。何らかの理由で、設定した変数名を終了しようとすると、保存ディレクトリが ido-mode に渡され、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)

savedirido-mode に関連してその変数を使用したことがないにもかかわらず、何らかの理由で ido が保持されていることがわかります (その変数が使用されているすべての場所と、私が作成したすべての ido 呼び出しを含めました)。ido が saveir で何かを行うのはなぜですか?

4

1 に答える 1

3

問題は次のとおりだと思います。

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

する必要があります

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

説明: Emacs が終了するとき、Ido はその履歴を保存しようとしています。Emacs の標準的なバックアップ手順が開始され、そのファイルのバックアップが試行されます。savedirただし、 の構成で引用符を外すのを忘れてbackup-directory-alistいるため、コンス セルは、期待どおりの文字列のペアではなく、文字列と記号のペアになります。

于 2014-03-14T02:25:56.607 に答える