“区分,保存或杀死"在 Emacs 中杀死缓冲区时 [英] "Diff, save or kill" when killing buffers in Emacs

查看:18
本文介绍了“区分,保存或杀死"在 Emacs 中杀死缓冲区时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Emacs 中尝试终止包含更改的缓冲区时,消息:显示缓冲区 [缓冲区] 已修改;还是要杀死?(是或否)".

When trying to kill a buffer that contains changes in Emacs, the message: " Buffer [buffer] modified; kill anyway? (yes or no)" is displayed.

相反,我想让 Emacs 询问我是否愿意:1. 查看变化的差异,2. 保存缓冲区,3. 杀死缓冲区.

Instead of this I'd like to have Emacs ask me if I want to: 1. View a diff of what changed, 2. Save the buffer, 3. Kill the buffer.

怎么样?

推荐答案

答案在于使用 advice,因为在杀死缓冲区时,钩子通常会在您要更改的缓冲区已修改"提示之后运行.

The answer lies in using advice, because the hooks normally run when killing buffers run after the "buffer modified" prompt you want to change.

以下建议可以满足您的需求(我认为).一些注意事项:

The following advice does what you want (I think). A couple of notes:

  1. 运行差异时,原始缓冲区被标记为未修改 - 但您确实需要保存它.
  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)))

这篇关于“区分,保存或杀死"在 Emacs 中杀死缓冲区时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆