EMACS如何在缓冲区等于文件时重置缓冲区修改标志

3
有没有办法在缓冲区等于文件但被标记为已修改时重置缓冲区修改标记? 在这种情况下,我希望Emacs不要询问我是否保存。
3个回答

3
受@scottfrazer答案的启发,我编写了一组函数来自动检查与文件相关联的缓冲区是否应更新为“未修改”:

unmodified-buffer.el

一些对原始代码的改进包括:
  • 先比较文件大小,避免不必要地运行diff/创建临时文件;
  • 将要比较的文件大小限制在50kb以内,以保证良好的性能表现;
  • 钩子用于自动执行必要的状态更新;
  • 计时器调用使得检查只在空闲时间段后运行;
  • combine-after-change-calls 以便Emacs可以更高效地处理'after-change-functions 钩子。
说实话,虽然我已经使用Emacs进行了几年的编程,但我对Elisp并不是非常有经验。我非常希望社区的反馈来帮助改进这个项目。希望这可以帮到大家!

1
我使用 M-x package-install RET unmodified-buffer 通过 MELPA 安装了 Arthur 的 unmodified-buffer.el 包,然后在我的初始化文件中添加了 (require 'unmodified-buffer)(add-hook 'after-init-hook 'unmodified-buffer-global-mode) 这两行代码以启用它,它工作得很好! - mareoraft

2
假设您已经安装了 diff,那么可以执行以下操作:
(defun my-update-modified-flag ()
  "Update the buffer modified flag."
  (interactive)
  (let* ((buffer (current-buffer))
         (basefile
          (or (buffer-file-name buffer)
              (error "Buffer %s has no associated file" buffer)))
         (tempfile (make-temp-file "buffer-content-")))
    (with-current-buffer buffer
      (save-restriction
        (widen)
        (write-region (point-min) (point-max) tempfile nil 'silent)))
    (if (= (call-process "diff" nil nil nil basefile tempfile) 0)
        (progn
          (set-buffer-modified-p nil)
          (message "Buffer matches file"))
      (message "Buffer doesn't match file"))
    (delete-file tempfile)))

@scottfrazer 那么将一个非交互版本连接到kill-buffer-query-functions上怎么样? - event_jr
嗨scottfrazer。非常抱歉答案的接受迟了,我现在才明白这个机制。对我来说,这是一个非常有用的功能。 - Mario Giovinazzo

1
您可以使用这个表达式:
(set-buffer-modified-p nil)

注意!即使缓冲区已经被修改,它也会清除标志。

3
有一个命令叫做not-modified,绑定在M-~上。详见http://www.gnu.org/software/emacs/manual/html_mono/emacs.html#index-M_002d_007e-995。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接