2009-09-12 6 views
8

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

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

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

ответ

16

Для расширения Seth «s answer, я бы это сделать:

(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 избегает сохранения буфера W/из файлов. Вам нужно выяснить все точки входа, которые вы используете для переключения буферов, о которых вы заботитесь (я бы также посоветовал other-window).

+0

+1 от меня ... забыли о файле buffer -name – seth

+1

Отлично! Спасибо :) 6 лет спустя и все еще отличный ответ –

6

Я вроде новой для Emacs Lisp себя, но это работает в моем тестировании:

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

(ad-activate 'switch-to-buffer) 

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

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

(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now) 
(ad-activate 'switch-to-buffer) 
2

Пару идей.

Во-первых, если вы вызываете команду как сохранение с достаточно высокой частотой, вы можете рассмотреть более короткое связывание ключей для этой команды. Например, я также обнаружил, что у меня такое же «дергание», поэтому теперь я использую 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 предлагает, что advice not be used for key bindings. Я не совсем уверен, почему это так, но это то, что предлагает руководство FYI.

+0

Интересно. Когда я читал руководство, я не видел эту часть о связях с клавишами. Благодарю. – seth

+0

Единственная проблема с этим решением - когда вы, например. начните использовать 'ido-switch-buffer', вы также должны отслеживать изменения в своей функции. –

+0

Это правда, я полагаю, вы могли бы переконфигурировать символ switch-to-buffer этой новой функции (сохранение оригинала в другом символе, например, orig-save-to-buffer) –