Skip to content

Commit 4e58a9d

Browse files
committed
Update src
1 parent 259befd commit 4e58a9d

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

fextern.el

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,62 @@
3232

3333
;;; Code:
3434

35+
(require 'cl-lib)
36+
(require 'subr-x)
3537

38+
(defvar-local fextern-buffer-save-string-md5 nil
39+
"Buffer string when buffer is saved; this value encrypted with md5 algorithm.
40+
This variable is used to check if file are edited externally.")
41+
42+
;;;###autoload
43+
(defun fextern--update-buffer-save-string (&rest _)
44+
"Update variable `fextern-buffer-save-string-md5' once."
45+
(setq fextern-buffer-save-string-md5 (md5 (buffer-string))))
46+
47+
;;;###autoload
48+
(advice-add 'save-buffer :after #'fextern--update-buffer-save-string)
49+
50+
;;;###autoload
51+
(add-hook 'find-file-hook #'fextern--update-buffer-save-string)
52+
53+
;;
54+
;; (@* "Util" )
55+
;;
56+
57+
(defun fextern--file-content (path)
58+
"Return PATH file content."
59+
(if (file-exists-p path)
60+
(with-temp-buffer (insert-file-contents path) (buffer-string))
61+
""))
62+
63+
(defun fextern--valid-buffer-p (buffer)
64+
"Return non-nil if BUFFER does exist on disk."
65+
(when-let ((bfn (buffer-file-name buffer))) (file-exists-p bfn)))
66+
67+
(defun fextern--valid-buffer-list ()
68+
"Return a list of valid buffers."
69+
(cl-remove-if-not #'fextern--valid-buffer-p (buffer-list)))
70+
71+
;;
72+
;; (@* "Core" )
73+
;;
74+
75+
;;;###autoload
76+
(defun fextern-buffer-edit-externally-p (&optional buf)
77+
"Return non-nil if BUF is edited externally."
78+
(let* ((buf (or buf (current-buffer)))
79+
(path (buffer-file-name buf))
80+
(buffer-saved-md5 (with-current-buffer buf fextern-buffer-save-string-md5))
81+
(file-content (fextern--file-content path))
82+
(file-content-md5 (md5 file-content)))
83+
(not (equal file-content-md5 buffer-saved-md5))))
84+
85+
;;;###autoload
86+
(defun fextern-buffers-edit-externally ()
87+
"Return a list of buffers edit externally."
88+
(cl-remove-if-not
89+
(lambda (buf) (fextern-buffer-edit-externally-p (get-buffer buf)))
90+
(fextern--valid-buffer-list)))
3691

3792
(provide 'fextern)
3893
;;; fextern.el ends here

0 commit comments

Comments
 (0)