Автосохранение Emacs в буфере коммутатора - PullRequest
8 голосов
/ 12 сентября 2009

Назовите меня хромым, но я устал от своего подсознания C-x C-s нервный подергивание. Я переключаю буферы достаточно часто и думаю, что хотел бы сохранить определенный буфер, как только я переключусь на другой. У меня еще не было времени изучить основы Emacs-Lisp.

Любые советы о том, как это сделать, или лучшие решения?

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

Ответы [ 3 ]

16 голосов
/ 12 сентября 2009

Чтобы расширить на Сет ответ , я бы сделал это:

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

Проверка для buffer-file-name позволяет избежать сохранения буферов без файлов. Вам нужно выяснить все точки входа, которые вы используете для переключения нужных вам буферов (я бы также посоветовал other-window).

6 голосов
/ 12 сентября 2009

Я новичок в emacs lisp, но в моем тестировании это работает:

(defadvice switch-to-buffer (before save-buffer-now)
  (save-buffer))

(ad-activate 'switch-to-buffer)

Это немного раздражает, потому что вызывается после КАЖДОГО буфера (как scratch ) Итак, рассмотрим этот ответ как подсказку.

Если вы хотите отключить его, вам нужно позвонить:

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now)
(ad-activate 'switch-to-buffer)
2 голосов
/ 12 сентября 2009

Пара идей.

Во-первых, если вы обнаружите, что вызываете такую ​​команду, как save, с достаточно высокой частотой, вы можете рассмотреть более короткую привязку клавиш для этой команды. Например, я также обнаружил, что у меня та же «дрожь», поэтому теперь я использую f2 вместо C-x C-s для сохранения правок.

Функция, которую я связываю с f2, сохраняет каждый несохраненный буфер безоговорочно. Вы можете найти это полезным:

(defun force-save-all ()
    "Unconditionally saves all unsaved buffers."
    (interactive)
    (save-some-buffers t))

(global-set-key [f2] 'force-save-all)

Теперь перейдем к основному вопросу. Вы можете попробовать что-то вроде этого (обратите внимание, что force-save-all называется):

(defun my-switch-to-buffer (buffer)
    (interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil)))
    (force-save-all)
    (switch-to-buffer buffer))

(global-set-key "\C-xb" 'my-switch-to-buffer)

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

Я думал, что у @ seth была отличная идея по использованию совета, но я заметил, что руководство ELisp предлагает, чтобы совет не использовался для привязок клавиш . Я не совсем уверен, почему это так, но это то, что руководство предлагает к сведению.

...