Автосохранение Emacs в буфере переключения
Вопрос
Назовите меня хромым, но я устал от своего подсознания C-x C-s
нервное подергивание.Я достаточно часто переключаю буферы и думаю, что мне хотелось бы сохранить один буфер, как только я переключусь на другой.У меня еще не было времени изучить основы Emacs-Lisp.
Есть какие-нибудь подсказки о том, как это сделать или лучшие решения?
(Кстати, я нашел обходной путь автосохранения который может сохранить текущий буфер, как только вы бездействуете в течение определенного периода времени.)
Решение
Подробнее о Сете ответ , я бы сделал это:
(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)))
Проверка для имя-файла-буфера
не позволяет сохранять буферы без файлов. Вам нужно выяснить все точки входа, которые вы используете для переключения нужных вам буферов (я бы также посоветовал other-window
).
Другие советы
Я новичок в 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)
Пара идей.
Во-первых, если вы обнаружите, что вызываете команду типа «Сохранить» достаточно часто, вы можете рассмотреть возможность более короткой привязки клавиш для этой команды.Например, у меня тоже возникло такое же «подергивание», поэтому теперь я использую 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)
Конечно, вы также можете привязать функциональность буфера переключения к другой клавише, например функциональной клавише, чтобы выполнить операцию одним нажатием.
я думал так @Сет у меня была отличная идея насчет использования советов, но я заметил, что в руководстве ELisp говорится, что совет не использовать для привязок клавиш.Я не совсем понимаю, почему это так, но к вашему сведению, руководство предлагает именно это.