Как автоматически сохранять файлы при потере фокуса в Emacs

Можно ли настроить Emacs так, чтобы он сохранял все файлы, когда окно emacs теряет фокус?


person Rockiger    schedule 04.08.2009    source источник


Ответы (5)


Я использую это, это будет работать, только если emacs работает под X (как это, вероятно, будет в чем-то вроде Ubuntu).

(when
   (and (featurep 'x) window-system)
 (defvar on-blur--saved-window-id 0 "Last known focused window.")
 (defvar on-blur--timer nil "Timer refreshing known focused window.")
 (defun on-blur--refresh ()
   "Runs on-blur-hook if emacs has lost focus."
   (let* ((active-window (x-window-property
                          "_NET_ACTIVE_WINDOW" nil "WINDOW" 0 nil t))
          (active-window-id (if (numberp active-window)
                                active-window
                              (string-to-number
                               (format "%x00%x"
                                       (car active-window)
                                       (cdr active-window)) 16)))
          (emacs-window-id (string-to-number
                            (frame-parameter nil 'outer-window-id))))
     (when (and
            (= emacs-window-id on-blur--saved-window-id)
            (not (= active-window-id on-blur--saved-window-id)))
       (run-hooks 'on-blur-hook))
     (setq on-blur--saved-window-id active-window-id)
     (run-with-timer 1 nil 'on-blur--refresh)))
 (add-hook 'on-blur-hook #'(lambda () (save-some-buffers t)))
 (on-blur--refresh))
person Thomas Frössman    schedule 17.12.2012
comment
Работает в Ubuntu, как рекламируется, и не требует превращения Emacs в центр рабочего процесса. - person Ajit George; 19.03.2013
comment
Это абсолютно потрясающе, наконец-то решение проблемы и нет обходного пути. - person Rockiger; 20.08.2013
comment
Я считаю, что правильная строка формата должна быть %x%04x - для меня (Ubuntu 12.04) вторичные фреймы Emacs имеют идентификаторы, которые не работают с вашим хуком. (Основываясь только на экспериментах, не удалось найти никакой документации по этому поводу.) - person volferine; 25.11.2013

Я добавил обработчики фокуса в Gnu Emacs 24.4.

Они называются focus-in-hook и focus-out-hook.

Можете добавить

(defun save-all ()
  (interactive)
  (save-some-buffers t))

(add-hook 'focus-out-hook 'save-all)

в ваш файл .emacs, и он должен сохранять все файлы при потере фокуса.

person bonkydog    schedule 20.11.2013
comment
Один вкладыш: (add-hook 'focus-out-hook (lambda () (interactive) (save-some-buffers t))) - person ; 19.03.2016
comment
Документы, похоже, подразумевают, что ваше первое примечание больше не применяется - верно? После быстрого теста кажется, что focus-out-hook не запускается, когда оконный менеджер меняет фокус между кадрами emacs (которые принадлежат одному и тому же экземпляру emacs). Может быть, добавление handle-switch-frame изменило описанное вами поведение? - person ohspite; 26.01.2017
comment
@ohspite Похоже, ты прав. Спасибо за обновления. - person bonkydog; 28.01.2017

Не уверен, что это то, что вы хотите.

(defun dld-deselect-frame-hook ()
  (save-some-buffers 1))

(add-hook 'deselect-frame-hook 'dld-deselect-frame-hook)

Откуда: http://www.dribin.org/dave/blog/archives/2003/09/10/emacs/

РЕДАКТИРОВАТЬ: кажется, что это работает только в XEmacs

person Community    schedule 05.08.2009
comment
Да, я просмотрел все -хуки и -функции, но не нашел ничего, что говорило бы о выборе или фокусе. - person Rockiger; 06.08.2009

[…] Функция, о которой я говорю, принадлежит Scribes. Это очень удобно при редактировании html и тому подобного, вам больше не нужно нажимать C-x C-s, вы просто меняете окно и проверяете свой браузер.

В этом случае вместо переключения на браузерное приложение прикажите Emacs загрузить браузерное приложение (C-c C-v или M-x browse-url-of-buffer). С помощью этого метода вы можете написать собственную функцию, которая сохраняет буфер и затем запускает браузер, например:

(defun my-browse-url-of-buffer ()
  "Save current buffer and view its content in browser."
  (interactive)
  (save-buffer)
  (browse-url-of-buffer))

И прицепите его к удобному креплению.

Или вы все еще можете использовать html-autoview-mode, который каждый раз, когда вы сохраняете буфер, автоматически загружает файл в ваш любимый браузер.

person viam0Zah    schedule 10.08.2009
comment
Это звучит как интересное решение. Я попробую это. Но я все еще немного удивлен, что Emacs не может реагировать на что-то вроде изменения фокуса. - person Rockiger; 11.08.2009
comment
@Rockiger кажется, что Emacs не дает возможности подключиться к событию расфокусировки. - person viam0Zah; 12.08.2009

Вы можете использовать `auto-save-interval' для сохранения каждых n введенных вами символов. У меня установлено значение 100. Так что, может быть, каждые 2-3 строки кода?

auto-save-interval — это переменная, определенная в «исходном коде C». Его значение 100

Документация: *Количество входных событий между автосохранениями. Ноль означает отключить автосохранение из-за количества введенных символов.

Вы можете настроить эту переменную.

Это не отвечает на ваш первоначальный вопрос; это просто способ добиться чего-то подобного.

person EfForEffort    schedule 07.08.2009
comment
Я знаю, функция, о которой я говорю, принадлежит Scribes. Это очень удобно при редактировании html и тому подобного, вам больше не нужно нажимать C-x C-s, вы просто меняете окно и проверяете свой браузер. - person Rockiger; 08.08.2009