&引用;区分、保存或杀死”;在Emacs中终止缓冲区时

&引用;区分、保存或杀死”;在Emacs中终止缓冲区时,emacs,Emacs,尝试终止包含Emacs中更改的缓冲区时,会显示以下消息: 显示“缓冲区[Buffer]已修改;是否仍要终止?(是或否)” 与此相反,我希望Emacs询问我是否愿意: 1.查看变化的差异, 2.保存缓冲区, 3.杀死缓冲区 如何操作?您需要编写一些代码以放入和列表中。从概念上讲,您想要做的是 测试缓冲区是否已修改 显示您的信息并获取 响应,并按要求执行 然后清除修改的标志,以便 正常的终止缓冲区不会返回 再问一次 答案在于使用,因为钩子通常是在您想要更改的“buffer modified”(缓冲区

尝试终止包含Emacs中更改的缓冲区时,会显示以下消息: 显示“缓冲区[Buffer]已修改;是否仍要终止?(是或否)”

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


如何操作?

您需要编写一些代码以放入和列表中。从概念上讲,您想要做的是

  • 测试缓冲区是否已修改
  • 显示您的信息并获取 响应,并按要求执行
  • 然后清除修改的标志,以便 正常的终止缓冲区不会返回 再问一次
  • 答案在于使用,因为钩子通常是在您想要更改的“buffer modified”(缓冲区修改)提示之后运行的

    下面的建议正是你想要的(我认为)。几点注意:

  • 当运行diff时,原始缓冲区被标记为未修改-但是您确实需要保存它
  • 差异中的另一个缓冲区未被删除
  • 
    (defadvice kill buffer(在我的kill buffer检查激活周围)
    “缓冲区即将终止时提示。”
    (let*((缓冲区文件名(缓冲区文件名))
    备份文件)
    ;参见“备份缓冲区”
    (如果(和(缓冲区修改-p)
    缓冲区文件名
    (file-exists-p缓冲区文件名)
    (setq备份文件(car(查找备份文件名缓冲区文件名)))
    (让((回答(完成读取)(格式为“缓冲区修改%s,(d)iff,(s)ave,(k)ill?”(缓冲区名称))
    "("d"s"k)无)
    (条件((相等答案“d”)
    (set-buffer-modified-p nil)
    (let((原始缓冲区(当前缓冲区))
    (文件到差异(如果(file-newer-than-file-p缓冲区文件名备份文件)
    缓冲区文件名
    (备份文件)
    (设置缓冲区(获取缓冲区创建(格式“%s last revision”(文件名非目录文件为diff)))
    (缓冲区禁用撤消)
    (将文件内容文件插入到diff nil nil t)
    (set-buffer-modified-p nil)
    (setq缓冲区只读t)
    (ediff缓冲区(当前缓冲区)或原始缓冲区)
    ((相等答案“k”)
    (set-buffer-modified-p nil)
    广告(做它)
    (t
    (保存缓冲区)
    广告(做这件事)
    广告(做这件事)
    

    kill buffer hook在用户试图更改/避免的提示后运行。另请参见:我将其放在init文件中。现在,当我做M-x包列表包时,Emacs不断给我消息“Buffer modified
    *http elpa.gnu.org:80
    *,diff,save,kill?”。我想有一种方法可以修改代码来避免这种情况,但我对elisp是新手。 (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)))