2008-12-01 1 views
19

При попытке убить буфер, содержащий изменения в Emacs, сообщение: «Буфер [буфер] изменен; kill anyway? (Yes or no)» отображается.«Diff, save or kill» при убийстве буферов в Emacs

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

Как?

+1

Смотри также: http://stackoverflow.com/questions/626492/emacs-highlight-buffer-modifications – jmn 2009-07-31 01:45:01

ответ

21

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

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

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

 
(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))) 

+0

Я поместил это в свой файл инициализации. Теперь, когда я делаю пакеты пакетов пакетов M-x, Emacs продолжает давать мне сообщение «Buffer modified` * http elpa.gnu.org:80`*, diff, save, kill? ». Я предполагаю, что есть способ изменить код, чтобы избежать этого, но я новичок в elisp. – 2012-09-27 22:19:15

5

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

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

The kill- буферизаторы запускаются после запроса, которое пользователь пытается изменить/избежать. – 2008-12-02 16:33:21

 Смежные вопросы

  • Нет связанных вопросов^_^