【发布时间】:2008-12-01 17:30:12
【问题描述】:
当试图杀死一个包含 Emacs 更改的缓冲区时,消息: 显示“缓冲区 [缓冲区] 已修改;仍然杀死?(是或否)”。
我想让 Emacs 询问我是否愿意: 1.查看变化的差异, 2.保存缓冲区, 3. 杀死缓冲区。
怎么做?
【问题讨论】:
标签: emacs
当试图杀死一个包含 Emacs 更改的缓冲区时,消息: 显示“缓冲区 [缓冲区] 已修改;仍然杀死?(是或否)”。
我想让 Emacs 询问我是否愿意: 1.查看变化的差异, 2.保存缓冲区, 3. 杀死缓冲区。
怎么做?
【问题讨论】:
标签: emacs
答案在于使用advice,因为在杀死缓冲区运行在您要更改的“缓冲区已修改”提示之后运行的钩子通常会运行。
以下建议可以满足您的需求(我认为)。几点注意事项:
(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)))
【讨论】:
*http elpa.gnu.org:80*,差异,保存,杀死?”。我想有一种方法可以修改代码来避免这种情况,但我是 elisp 的新手。
您需要编写一些代码来放入kill-buffer-hooks 和write-file-functions 列表。从概念上讲,您想要做的是
【讨论】: