Як автоматично зберігати буфери, коли Emacs втрачає фокус?


26

Нещодавно у мене на деякий час був користувач Sublime Text, який випробував Emacs, і він був зацікавлений у тому, щоб в Emacs було те саме поведінку автоматичного збереження.

В основному, він хотів, щоб усі буфери були збережені, коли кадр втрачав фокус (дійсно збережений, а не лише резервний). Це стосується перемикання вікон на зовсім інший додаток.

Я не зміг знайти жодної події, яка була викликана при переході на інший додаток. Чи є така подія чи є інший спосіб досягти такої ж поведінки?

Зауважте, що часове рішення не було задовільним, і жодна з них не була поведінкою автоматичного резервного копіювання за замовчуванням. Він спеціально хотів, щоб буфери були збережені (як у save-buffer) для всіх файлів.

Відповіді:


29

На жаль, така точна поведінка неможлива в Emacs <= 24.3, але ви можете заощадити на зміні вікна / буфера за допомогою defadvice(як детально в блозі bbatsov ):

(defadvice switch-to-buffer (before save-buffer-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))
(defadvice other-window (before other-window-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))

У Emacs 24.4 ви також зможете заощадити на втраті фокусу кадру завдяки новим гакам фокусування : (add-hook 'focus-out-hook 'save-buffer)(для збереження активного буфера) або (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(для збереження всіх відкритих буферів).


1
Чи можете ви трохи розширити defadviceверсію, якщо випадок блогу зменшиться чи щось? Спасибі!
Тихон Єлвіс

На жаль, таке рішення зберігає видимий в даний час буфер, а не всі буфери.
b4hand

1
@ b4hand: Вибачте, не зрозумів, що ти цього хотів. Відповідь оновлено.
shosti

1
@shosti До речі, дякую, що знайшов для мене це посилання на блог bbatsov. Я фактично знайшов це рішення раніше, але не зміг його знайти знову. Я збирався включити це як одне з непрацюючих рішень у своєму питанні.
b4hand

2
Мені подобається робити це таким чином, щоб уникнути пошкоджень мінібуфера (вибачте від форматування): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Андреас

6

Зараз є focus-autosave-mode. Доступний через MELPA. Чому б не дати шанс зробити хакерство для вас‽


Привіт, як це працює? Я встановив його, але це, здається, не працює.
Асме Тільки

@AsmeJust, я не використовую зараз, спробуйте запитати про його трекер випуску тут: github.com/vifon/focus-autosave-mode.el/isissue
Марк Карпов

Ви зараз використовуєте альтернативу чи щось подібне?
Асме Просто

Ні, я нічого подібного зараз не використовую.
Марк Карпов

Але ви все ще використовуєте Emacs, правда?
Асме Просто

3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

Це збереже всі збережені буфери відвідувального файлу на emacs 24.4


2
Не використовуйте add-to-listна гачку, використовуйте add-hook. Відповідь shosti вже містить правильну форму цього фрагмента.
Жил "ТАК - перестань бути злим"

1

Для мандрівників, які натрапляють на це, я використовую таку форму:

(eval-when-compile (require 'cl-lib))
;; [...]
(add-hook 'focus-out-hook
  (lambda ()
    (cl-letf (((symbol-function 'message) #'format))
      (save-some-buffers t))))

Використання cl-letfзахищає від дратівливих (No files need saving)повідомлень від засмічення вашої ехо-зони.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.