Как я могу предотвратить зависание emacs, когда в Initial-buffer-choice есть автосохранение данных?

Я использую emacs в режиме демона, и у меня также есть набор переменных initial-buffer-choice. Иногда emacs дает сбой, когда я редактирую файл, который использую для initial-buffer-choice. В этом случае, когда я запускаю emacs с параметром --daemon, он зависает с сообщением:

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

Поскольку я в основном запускаю демон из сценария инициализации, я не могу подтвердить или опровергнуть этот диалог, поэтому демон зависает навсегда. Как в этом случае обойти уведомление об автосохранении данных? Я не возражаю против потери данных автоматического сохранения, если это необходимо.

Вот моя попытка сделать это:

(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 зависает, если в файле есть данные автосохранения. Однако это решение не работает для initial-buffer-choice. Принятый ответ, похоже, был отредактирован из предыдущей версии, которая, возможно, успешно определила совет по command-line, как я пытался это сделать, но, к сожалению, эта версия больше не существует и заменена версией для desktop.el.


person amoe    schedule 23.03.2013    source источник
comment
"... has auto save data; consider ..." — это просто сообщение, а не диалог. Причина, по которой демон зависает, должна быть чем-то другим.   -  person Rörd    schedule 21.10.2013
comment
Возможно, взглянув на after-find-file в files.el, вы сможете понять, как решить проблему с подтверждением. В качестве альтернативы взгляните на функцию, которая вызывает after-find-file при загрузке Emacs с помощью --daemon.   -  person lawlist    schedule 21.10.2013


Ответы (3)


Основываясь на описании поведения, о котором сообщал первоначальный автор в вопросе к этой ветке, может показаться, что когда Emacs активируется с помощью --daemon, initial-buffer-choice (т. е. до 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 или .emacs (без хука) - затем, чтобы убедиться, что все остальные настройки были загружены первыми, используйте emacs-startup-hook для (kill-buffer "*scratch*") и (find-file "~/.../todo.org") - это гарантирует, что автосохранение отключен перед вызовом find-file (который использует find-file-noselect [см. ... lisp/files.el]).

person lawlist    schedule 25.10.2013

Одной из возможностей было бы поместить это в ваш .emacs:

(setq auto-save-default nil)

Другое (вероятно, лучшее решение) — подавить предупреждающее сообщение, используя это вместо этого для поиска файлов:

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

Как вы можете видеть здесь, вы можете подавить предупреждающее сообщение, используя необязательный аргумент NOWARN (потому что именно он вызывает проблему).

Источник: эта страница EmacsWiki

Вот изменение, которое вы могли бы внести, если бы я решил это для себя. Определите в настройках .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").

person PascalVKooten    schedule 23.03.2013
comment
Спасибо за помощь Dualinity. К сожалению, на данный момент я не могу воспроизвести исходный выпуск. Я проверю и приму ответ, когда смогу его воспроизвести. - person amoe; 03.04.2013
comment
Это не помогло. emacs --daemon все равно зависает при загрузке - person Sergey; 01.05.2013
comment
Возможно, initial-buffer-choice активируется в последовательности запуска до (setq auto-save-default nil). Если изменение порядка не дает эффекта, рассмотрите возможность использования (setq initial-buffer-choice t) в дополнение к (setq auto-save-default nil), а затем используйте от emacs-startup-hook до (kill-buffer "*scratch*") (find-file "~/.../todo.org"). - person lawlist; 21.10.2013
comment
Этот последний сработал - с использованием emacs-startup-hook, хотя это ужасный хак, если вы опубликуете его как ответ, я могу его принять. - person amoe; 24.10.2013

Так как "...имеет данные автосохранения; рассмотрите M-x, восстановите-этот-файл" является только сообщением, я не уверен, что проблема действительно связана с файлом автосохранения. Но, если это так, вы можете создать тест, является ли каталог автоматического сохранения для emacs пустым (directory-files) в файле инициализации вашего сервера. Если каталог автосохранения не пуст, переместите все файлы в другое место и продолжайте (rename-file).

Мне очень интересно, решит ли это проблему.

Настоящий вопрос таков: как отлаживать проблемы с сервером в emacs. Debug и edebug довольно бессмысленны в режиме сервера. Лучше трассировать все в файл (что-то вроде логирования).

person Tobias    schedule 24.10.2013
comment
Да, это решение сработало, супер хак: (let ((autosave-path "/home/amoe/etc/autosave")) (dolist (autosave-file (directory-files autosave-path nil "^#")) (rename-file (concat autosave-path "/" autosave-file) (concat "/tmp/" autosave-file)))) - person amoe; 24.10.2013