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

EMACS如何在缓冲区等于文件时重置缓冲区修改标志,emacs,Emacs,当缓冲区等于文件但标记为已修改时,是否有方法重置缓冲区修改标志?在这种情况下,我想要emacs,不要要求我保存。您可以使用以下表达式: (set-buffer-modified-p nil) 当心!即使缓冲区真的被修改了,它也会清除标志。如果您安装了diff,这将完成以下操作: (defun my-update-modified-flag () "Update the buffer modified flag." (interactive) (let* ((buffer (curr

当缓冲区等于文件但标记为已修改时,是否有方法重置缓冲区修改标志?在这种情况下,我想要emacs,不要要求我保存。

您可以使用以下表达式:

(set-buffer-modified-p nil)

当心!即使缓冲区真的被修改了,它也会清除标志。

如果您安装了
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答案的启发,我编写了一组函数来自动检查与文件关联的缓冲区是否应更新为“未修改”:

对原始代码的一些改进包括:

  • 首先比较文件大小,以避免不必要地运行差异/创建临时文件
  • 将文件大小限制为50kb,以获得良好的性能
  • 钩子在必要时自动执行状态更新
  • 计时器调用,使检查仅在空闲时间段后运行
  • 更改后合并调用
    ,以便Emacs可以更有效地处理
    “更改后”函数
    挂钩

老实说,我对Elisp没有太多经验,尽管我已经用Emacs进行了几年的黑客攻击。我非常感谢社区的反馈,以帮助改进这一点。希望这能有所帮助

多谢各位!这正是我想要的need@scottfrazer如何将非交互式版本连接到
kill buffer query functions
。我很抱歉延迟接受答案(我现在才了解机制)。这是一个非常有用的函数,我有一个命令
未修改
,它绑定到
M-~
。看见