当initial-buffer-choice有自动保存数据时,如何防止emacs挂起?

时间:2013-03-23 12:32:12

标签: emacs advising-functions

我在守护进程模式下使用emacs,我也有一个initial-buffer-choice 变量集。有时emacs会在我编辑文件时崩溃 我用于initial-buffer-choice。在这种情况下,当我开始 使用--daemon的emacs,它将挂起消息:

"todo.org has auto save data; consider M-x recover-this-file"

由于我主要是从init脚本启动守护进程,所以我无法确认或 拒绝此对话框,因此守护程序将永久挂起。我怎么能绕过 在这种情况下自动保存数据的通知?我不介意失去 必要时自动保存数据。

我试图这样做:

(defadvice command-line
  (around my-command-line-advice)
  "Be non-interactive while starting a daemon."
  (if (and (daemonp)
           (not server-process))
      (let ((noninteractive t))
        ad-do-it)
    ad-do-it))
 (ad-activate 'command-line)

然而,这不起作用。我仍然得到相同的悬挂行为。 实际上,在建议中加入“消息”调用会显示建议 根本没有被调用。

类似的问题:emacs-daemon startup freezes if file has auto-save data。但是,此解决方案不适用于initial-buffer-choice。接受的答案似乎是从以前的版本编辑过来的,这个版本可能已经成功定义了command-line的建议,但是很遗憾,这个版本现已不复存在,取而代之的是desktop.el特有的版本。

3 个答案:

答案 0 :(得分:1)

一种可能性是将它放在.emacs中:

(setq auto-save-default nil)

另一个(可能更好的解决方案)是通过使用它来查找文件来禁止显示警告消息:

(find-file-noselect FILENAME &optional NOWARN RAWFILE WILDCARDS)

正如您在此处所看到的,您可以使用可选的NOWARN参数来抑制警告消息(因为这是导致问题的原因)。

来源:this EmacsWiki page

如果我要为自己解决这个问题,您可以做出改变。 在.emacs设置中定义:

(defun find-file (filename &optional wildcards)
  (interactive
   (find-file-read-args "Find file: "
                        (confirm-nonexistent-file-or-buffer)))

  ; the "t" here is normally set to "nil", this should solve the problem
  (let ((value (find-file-noselect filename t nil wildcards)))  
    (if (listp value)
    (mapcar 'switch-to-buffer (nreverse value))
      (switch-to-buffer value))))

编辑:到目前为止,这对任何人都没有帮助,但为了完整起见,它可能有所帮助。

提问者确认的当前方式是使用emacs-startup-hook并将其与(kill-buffer "*scratch*")(find-file "~/.../todo.org")结合使用。

答案 1 :(得分:1)

根据问题中原始海报报告给该主题的行为的描述,当使用--daemon激活Emacs时,initial-buffer-choice(即,{{1}在启动序列之前激活[请find-file-noselect "~/.../todo.org"])可以使用... lisp/startup.el禁用默认设置自动保存。如果更改顺序没有效果[即,将(setq auto-save-default nil)置于初始化文件中的优先级,使其位于(setq auto-save-default nil)]之前,则下一步是采取肯定行动以确保在打开文件之前禁用自动保存(例如,initial-buffer-choice)。这可以通过将todo.org(setq initial-buffer-choice t)放在(setq auto-save-default nil)init.el文件中(没有挂钩)来实现 - 然后,确保首先加载所有其他设置,使用.emacsemacs-startup-hook(kill-buffer "*scratch*") - 这可确保在调用 (find-file "~/.../todo.org")之前禁用自动保存(使用{{ 1}} [见find-file])。

答案 2 :(得分:0)

由于“ ...有自动保存数据;考虑M-x recover-this-file ”只是一条消息,我不确定该问题是否与自动保存文件有关。但是,如果是这种情况,您可以构建一个测试,以确定emacs的自动保存目录是否为空(directory-files)到您的服务器init文件中。如果自动保存目录不为空,请将所有文件移至另一个位置并继续(rename-file)。

我真的好奇这是否能解决这个问题。

真正的问题是:如何调试emacs中的服务器问题。调试和edebug在servermode中非常不敏感。最好将所有内容跟踪到文件(例如日志记录)。