|
32 | 32 |
|
33 | 33 | ;;; Code: |
34 | 34 |
|
| 35 | +(require 'cl-lib) |
| 36 | +(require 'subr-x) |
35 | 37 |
|
| 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))) |
36 | 91 |
|
37 | 92 | (provide 'fextern) |
38 | 93 | ;;; fextern.el ends here |
0 commit comments