«Различайся, спасай или убивай», когда убиваешь буферы в Emacs - PullRequest
19 голосов
/ 01 декабря 2008

При попытке уничтожить буфер, содержащий изменения в Emacs, появляется сообщение: "Буфер [буфер] изменен; убить в любом случае? (Да или нет)" отображается.

Вместо этого я бы хотел, чтобы Emacs спросил меня, хочу ли я: 1. Просмотр изменений того, что изменилось, 2. Сохраните буфер, 3. Убить буфер.

Как?

Ответы [ 2 ]

21 голосов
/ 02 декабря 2008

Ответ заключается в использовании advice , потому что перехваты обычно запускаются, когда уничтожающие буферы запускают после запроса «изменение буфера», который вы хотите изменить.

Следующий совет делает то, что вы хотите (я думаю). Пара заметок:

  1. При запуске diff исходный буфер помечается как неизмененный, но вам действительно нужно его сохранить.
  2. Другой буфер в diff не удаляется

(defadvice kill-buffer (around my-kill-buffer-check activate) "Prompt when a buffer is about to be killed." (let* ((buffer-file-name (buffer-file-name)) backup-file) ;; see 'backup-buffer (if (and (buffer-modified-p) buffer-file-name (file-exists-p buffer-file-name) (setq backup-file (car (find-backup-file-name buffer-file-name)))) (let ((answer (completing-read (format "Buffer modified %s, (d)iff, (s)ave, (k)ill? " (buffer-name)) '("d" "s" "k") nil t))) (cond ((equal answer "d") (set-buffer-modified-p nil) (let ((orig-buffer (current-buffer)) (file-to-diff (if (file-newer-than-file-p buffer-file-name backup-file) buffer-file-name backup-file))) (set-buffer (get-buffer-create (format "%s last-revision" (file-name-nondirectory file-to-diff)))) (buffer-disable-undo) (insert-file-contents file-to-diff nil nil nil t) (set-buffer-modified-p nil) (setq buffer-read-only t) (ediff-buffers (current-buffer) orig-buffer))) ((equal answer "k") (set-buffer-modified-p nil) ad-do-it) (t (save-buffer) ad-do-it))) ad-do-it)))

5 голосов
/ 01 декабря 2008

Вы захотите написать некоторый код для включения в списки kill-buffer-hooks и write-file-functions . Концептуально, что вы хотите сделать, это

  1. проверить, был ли изменен буфер
  2. отобразите ваше сообщение и получите ответьте и сделайте то, что просили
  3. затем снимите измененный флаг, чтобы обычный kill-buffer не возвращается и спросите снова.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...