当缓冲区等于文件但被标记为已修改时,有没有办法重置缓冲区修改标志? 在这种情况下,我希望 emacs 不要要求我保存。
受到@scottfrazer回答的启发,我编写了一组函数来自动检查与文件关联的缓冲区是否应更新为"未修改":
unmodified-buffer.el
对原始代码的一些改进是:
- 首先比较文件大小,以避免不必要的差异/临时文件的创建;
- 将要比较的文件大小限制为 50kb 以获得良好的性能;
- 钩子在必要时自动执行状态更新;
- 计时器调用以使检查仅在空闲时间段后运行;
-
combine-after-change-calls
,以便 Emacs 可以更有效地处理'after-change-functions
钩子。
老实说,我对 Elisp 没有那么多经验,尽管我已经使用 Emacs 几年了。我非常感谢社区的反馈,以帮助改善这一点。希望这能有所帮助!
鉴于您已经安装了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)))
您可以使用此表达式:
(set-buffer-modified-p nil)
小心!即使缓冲区确实被修改,它也会清除标志。