-
Notifications
You must be signed in to change notification settings - Fork 5
/
revbufs.el
118 lines (102 loc) · 4.3 KB
/
revbufs.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
;;; revbufs.el -- reverts all out-of-date buffers safely
;; Author: Neil Van Dyke <[email protected]>
;; Version: 1.2
;; X-URL: http://www.neilvandyke.org/revbufs/
;; X-CVS: $Id: revbufs.el,v 1.20 2007-03-02 05:45:46 neil Exp $ GMT
;; Copyright (C) 1997-1999,2002,2007 Neil W. Van Dyke. This is free software;
;; you can redistribute it and/or modify it under the terms of the GNU General
;; Public License as published by the Free Software Foundation; either version
;; 2, or (at your option) any later version. This is distributed in the hope
;; that it will be useful, but without any warranty; without even the implied
;; warranty of merchantability or fitness for a particular purpose. See the
;; GNU General Public License for more details. You should have received a
;; copy of the GNU General Public License along with Emacs; see the file
;; `COPYING'. If not, write to the Free Software Foundation, Inc., 59 Temple
;; Place, Suite 330, Boston, MA 02111-1307, USA.")
;;; Commentary:
;; `revbufs' reverts Emacs buffers that are visiting files that have been
;; modified outside Emacs' control. This is useful for files generated by a
;; compiler, or log files. `revbufs' won't revert a buffer that has been
;; modified (what it calls "conflicts"), and will tell you if any files
;; disappeared out from under your buffers ("orphans").
;;; Change Log:
;; [Version 1.2, 2007-03-01, [email protected]] Added missing `provide'.
;; [Version 1.1, 15-Oct-2002] Updated email address, URL, comments.
;;
;; [Version 1.0, 04-Sep-1999] Initial release.
;;; Code:
(defun revbufs ()
(interactive)
(let ((conflicts '())
(orphans '())
(reverts '())
(report-buf (get-buffer-create "*revbufs*")))
;; Process the buffers.
(mapcar (function
(lambda (buf)
(let ((file-name (buffer-file-name buf)))
(cond
;; If buf is the report buf, ignore it.
((eq buf report-buf) nil)
;; If buf is not a file buf, ignore it.
((not file-name) nil)
;; If buf file doesn't exist, buf is an orphan.
((not (file-exists-p file-name))
(setq orphans (nconc orphans (list buf))))
;; If file modified since buf visit, buf is either a conflict
;; (if it's modified) or we should revert it.
((not (verify-visited-file-modtime buf))
(if (buffer-modified-p buf)
(setq conflicts (nconc conflicts (list buf)))
(save-excursion
(set-buffer buf)
(revert-buffer t t))
(setq reverts (nconc reverts (list buf)))))))))
(copy-sequence (buffer-list)))
;; Prepare the report buffer.
(save-excursion
(set-buffer report-buf)
(setq buffer-read-only nil
truncate-lines t)
(delete-region (point-min) (point-max))
(insert (revbufs-format-list conflicts "CONFLICTS")
(revbufs-format-list orphans "ORPHANS")
(revbufs-format-list reverts "REVERTS"))
(goto-char (point-min))
(setq buffer-read-only t))
(bury-buffer report-buf)
;; Print message in echo area.
(if (or conflicts orphans)
(progn
(display-buffer report-buf)
(message
(concat
(format "Reverted %s with"
(revbufs-quantity (length reverts) "buffer"))
(if conflicts
(format " %s%s"
(revbufs-quantity (length conflicts) "conflict")
(if orphans " and" "")))
(if orphans
(format " %s"
(revbufs-quantity (length orphans) "orphan"))))))
(if reverts
(message "Reverted %s." (revbufs-quantity (length reverts) "buffer"))
(message "No buffers need reverting.")))))
(defun revbufs-format-list (list label)
(if list
(concat label
(format " (%s):\n" (length list))
(mapconcat
(function
(lambda (buf)
(format " %-20s %s\n"
(buffer-name buf)
(buffer-file-name buf))))
list
""))
""))
(defun revbufs-quantity (num what)
(format "%d %s%s" num what (if (= num 1) "" "s")))
(provide 'revbufs)
;; revbufs.el ends here