在 Emacs 中杀死缓冲区时“区分、保存或杀死”

Posted

技术标签:

【中文标题】在 Emacs 中杀死缓冲区时“区分、保存或杀死”【英文标题】:"Diff, save or kill" when killing buffers in Emacs 【发布时间】:2008-12-01 17:30:12 【问题描述】:

当试图杀死一个包含 Emacs 更改的缓冲区时,消息: 显示“缓冲区 [缓冲区] 已修改;仍然杀死?(是或否)”。

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

怎么做?

【问题讨论】:

另见:***.com/questions/626492/… 【参考方案1】:

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

以下建议可以满足您的需求(我认为)。几点注意事项:

    运行 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)))

【讨论】:

我把它放在我的初始化文件中。现在,当我执行 M-x package-list-packages 时,Emacs 不断给我消息“缓冲区已修改*http elpa.gnu.org:80*,差异,保存,杀死?”。我想有一种方法可以修改代码来避免这种情况,但我是 elisp 的新手。【参考方案2】:

您需要编写一些代码来放入kill-buffer-hooks 和write-file-functions 列表。从概念上讲,您想要做的是

    测试缓冲区是否被修改 显示您的消息并获得 响应,并按照要求进行操作 然后清除修改的标志,以便 正常的杀戮缓冲区不会回来 并再次询问。

【讨论】:

kill-buffer-hooks 在用户尝试更改/避免的提示之后运行。

以上是关于在 Emacs 中杀死缓冲区时“区分、保存或杀死”的主要内容,如果未能解决你的问题,请参考以下文章

使用 tramp 自动保存其他窗口时 Emacs 更改缓冲区

5.Emacs快速入门之缓冲区

如何在 Emacs 中将文件加载到缓冲区并在启动时切换到缓冲区

Emacs:帮助我理解文件/缓冲区管理

当磁盘上的文件发生更改时,如何让 Emacs 自动刷新所有缓冲区?

emacs 列表缓冲区行为