Подтвердить что ты не робот

"Diff, save or kill" при убийстве буферов в Emacs

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

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

Как?

4b9b3361

Ответ 1

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

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

  • При запуске diff исходный буфер помечен как не измененный - но вам действительно нужно его сохранить.
  • Другой буфер в 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)))

Ответ 2

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

  • проверить, был ли изменен буфер
  • отобразите свое сообщение и получите ответ и сделайте то, что запрошено
  • затем очистите измененный флаг, чтобы нормальный kill-buffer не возвращается и попросите еще раз.