Можно ли настроить Emacs так, чтобы он сохранял все файлы, когда окно emacs теряет фокус?
Как автоматически сохранять файлы при потере фокуса в Emacs
Ответы (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))
Я добавил обработчики фокуса в 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, и он должен сохранять все файлы при потере фокуса.
(add-hook 'focus-out-hook (lambda () (interactive) (save-some-buffers t)))
- person ; 19.03.2016
focus-out-hook
не запускается, когда оконный менеджер меняет фокус между кадрами emacs (которые принадлежат одному и тому же экземпляру emacs). Может быть, добавление handle-switch-frame
изменило описанное вами поведение?
- person ohspite; 26.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
[…] Функция, о которой я говорю, принадлежит 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
, который каждый раз, когда вы сохраняете буфер, автоматически загружает файл в ваш любимый браузер.
Вы можете использовать `auto-save-interval' для сохранения каждых n введенных вами символов. У меня установлено значение 100. Так что, может быть, каждые 2-3 строки кода?
auto-save-interval — это переменная, определенная в «исходном коде C». Его значение 100
Документация: *Количество входных событий между автосохранениями. Ноль означает отключить автосохранение из-за количества введенных символов.
Вы можете настроить эту переменную.
Это не отвечает на ваш первоначальный вопрос; это просто способ добиться чего-то подобного.