1
|
1 ;; Last edited: Fri Aug 20 14:49:23 1999
|
|
2 ;; gnus customisation
|
|
3 (setq mm-inline-large-images t) ;prevent crash in mm-image-fit-p ???
|
|
4 (setq gnus-novice-user nil)
|
|
5 (setq gnus-message-archive-group
|
|
6 '((concat "general." (format-time-string
|
|
7 "%Y-%m" (current-time)))))
|
|
8
|
|
9 (setq gnus-summary-ignore-duplicates t
|
|
10 gnus-auto-select-next 'quietly
|
|
11 gnus-summary-display-arrow nil
|
|
12 gnus-your-organization "HCRC, University of Edinburgh"
|
|
13 gnus-ignored-headers
|
|
14 "^Errors-To:\\|^Precedence:\\|^UNIX-From:"
|
|
15 mm-discouraged-alternatives '("text/html")
|
|
16 nnmail-expiry-wait 28
|
|
17 nnmail-spool-file
|
|
18 '((file)(file :path "/home/ht/mbox")))
|
|
19
|
|
20 (setq bbdb/news-auto-create-p t)
|
|
21
|
|
22 (defconst hash-file "/home/ht/.whitelist")
|
|
23
|
|
24 (defvar white-hash (make-hash-table :test (function equal)))
|
|
25
|
|
26 (with-current-buffer (get-buffer-create " *Whitelist")
|
|
27 (insert-file-contents hash-file)
|
|
28 (goto-char (point-min))
|
|
29 (while (not (eobp))
|
|
30 (puthash (buffer-substring (point) (progn
|
|
31 (end-of-line)
|
|
32 (point)))
|
|
33 t
|
|
34 white-hash)
|
|
35 (forward-line)))
|
|
36
|
|
37 (defun get-from-addr ()
|
|
38 (gnus-extract-address-components
|
|
39 (gnus-fetch-field "From")))
|
|
40
|
|
41 (defun get-current-from-addr ()
|
|
42 (with-current-buffer gnus-article-buffer
|
|
43 (get-from-addr)))
|
|
44
|
|
45 (defun white-list (list)
|
|
46 (if (or (gethash (cadr (get-from-addr))
|
|
47 white-hash)
|
|
48 (let ((subj (gnus-fetch-field "Subject")))
|
|
49 (and subj
|
|
50 (string-match "\\[\\([^]]*\\)\\]" subj)
|
|
51 (member (match-string 1 subj) white-lists))))
|
|
52 list))
|
|
53
|
|
54 (defun add-white ()
|
|
55 (interactive)
|
|
56 (gnus-summary-goto-article (gnus-summary-article-number))
|
|
57 (do-add-white (cadr (get-current-from-addr))))
|
|
58
|
|
59 (defun do-add-white (addr)
|
|
60 (puthash addr t white-hash)
|
|
61 (with-current-buffer (get-buffer " *Whitelist")
|
|
62 (let ((max (point-max)))
|
|
63 (goto-char max)
|
|
64 (insert addr)
|
|
65 (insert "\n")
|
|
66 (write-region max (point) hash-file t))))
|
|
67
|
|
68 (defun bogoNote (group)
|
|
69 (shell-command-on-region (point-min) (point-max)
|
|
70 "/home/ht/bin/makeBogo")
|
|
71 'delete)
|
|
72
|
|
73
|
|
74 (defun whiten-recip ()
|
|
75 ;;; a hook for outgoing mail
|
|
76 (let ((recips (message-options-get 'message-recipients)))
|
|
77 (mapcar (function new-white)
|
|
78 (split-string recips ",[ \f\t\n\r\v]+" t))))
|
|
79
|
|
80 (add-hook 'message-sent-hook (function whiten-recip))
|
|
81
|
|
82 (defun new-white (addr)
|
|
83 (if (gethash addr white-hash)
|
|
84 nil
|
|
85 (do-add-white addr)))
|
|
86
|
|
87 (setq wsp-cache nil)
|
|
88
|
|
89 (defun split-on-whole-field (field pat list)
|
|
90 (goto-char (point-max))
|
|
91 (let ((hit (assq pat wsp-cache))
|
|
92 rpat)
|
|
93 (if hit
|
|
94 (setq rpat (cdr hit))
|
|
95 (setq rpat
|
|
96 (concat "^"
|
|
97 field
|
|
98 ":\\s-*"
|
|
99 (if (stringp pat)
|
|
100 pat
|
|
101 (cdr (assq pat
|
|
102 nnmail-split-abbrev-alist)))
|
|
103 "$"))
|
|
104 (setq wsp-cache (cons (cons pat rpat) wsp-cache)))
|
|
105 (if (re-search-backward rpat nil t)
|
|
106 list)))
|
|
107
|
|
108 (setq nnmail-crosspost nil)
|
|
109 (setq nnmail-split-methods 'nnmail-split-fancy)
|
|
110
|
|
111 (setq ht-lists
|
|
112 '(("Subject" "Cron <mt> /home/mt/bin/heartbeat" "heartbeat")
|
|
113 ("Subject" "Cron <mt[@]markup> /home/mt/bin/heartbeat" "heartbeat")
|
|
114 (to "xml-dev" "xml")
|
|
115 (to "markup@markup[a-zA-Z]*" "markup")
|
|
116 (to "general@developer.marklogic.com" "marklogic")
|
|
117 (to "betterform-users@lists.sourceforge.net" "betterform")
|
|
118 (to "betterform-developer@lists.sourceforge.net" "betterform")
|
|
119 (to "mrbs-[a-zA-Z]*@lists.sourceforge.net" "mrbs")
|
|
120 (to "selenium-users" "selenium")
|
|
121 (to "sqlobject-discuss" "sqlobject")
|
|
122 (to "exist-open@lists.sourceforge.net" "exist")
|
|
123 (to "exim-users@exim.org" "exim")
|
|
124 (to "exist-development@lists.sourceforge.net" "exist")
|
|
125 (to "xsltforms-support@lists.sourceforge.net" "xsltforms")
|
|
126 (to "mtt" "mtt")
|
|
127 (to "ding" "gnus")))
|
|
128
|
|
129 (setq white-lists '("selenium-users" "Betterform-users" "Exist-development" "Exist-open"))
|
|
130
|
|
131 (defvar ht-compiled-split nil)
|
|
132
|
|
133 (defun set-ht-compiled-split ()
|
|
134 "update the mail splitting rules"
|
|
135 (interactive)
|
|
136 (setq ht-compiled-split
|
|
137 (let* ((month
|
|
138 (format-time-string "%Y-%m" (current-time)))
|
|
139 (now-group (concat "group-" month))
|
|
140 (now-pers (concat "pers-" month)))
|
|
141 `(|
|
|
142 (: split-on-whole-field "Subject" "testing" 'junk)
|
|
143 ,@ht-lists
|
|
144 (to "ht\\|henry\\|\\(h\\.?\\)?thompson?" ,now-pers)
|
|
145 (to "xml-dev" "xml")
|
|
146 ,now-group
|
|
147 ))))
|
|
148
|
|
149 (set-ht-compiled-split)
|
|
150
|
|
151 (setq nnmail-split-fancy
|
|
152 '(!
|
|
153 (lambda (sres)
|
|
154 (if (or (equal (car sres) "notSPAM")
|
|
155 (equal (car sres) "waSPAM"))
|
|
156 ;; documentation is wrong, no recursion,
|
|
157 ;; so we do it ourselves :-(
|
|
158 (nnmail-split-it ht-compiled-split)
|
|
159 sres))
|
|
160 (| (to "ht@hppllc.org" "llc")
|
|
161 ("X-Bogosity" "\\(Yes\\|Unsure\\).*"
|
|
162 (| (: white-list "waSPAM")
|
|
163 ("X-Spam-Score" "0" "boSPAM")
|
|
164 ("X-Bogosity" "Unsure.*" "mSPAM")
|
|
165 "bfSPAM"))
|
|
166 (: split-on-whole-field "X-Spam-Level" "\\*\\*\\*\\*.*"
|
|
167 '(| (: white-list "waSPAM")
|
|
168 "saSPAM"))
|
|
169 ("X-Spam-Status" "Yes.*"
|
|
170 (| (: white-list "waSPAM")
|
|
171 "saSPAM"))
|
|
172 "notSPAM")))
|
|
173
|
|
174 (defun ht-gnus-summary-delete-forward ()
|
|
175 "REAL delete for nnmail gnus"
|
|
176 (interactive)
|
|
177 (gnus-summary-delete-article)
|
|
178 (gnus-summary-next-unread-article))
|
|
179
|
|
180 (require 'my-news)
|
|
181 (setq gnus-show-mime t) ; stale
|
|
182
|
|
183 ;; try to ignore list name in subject for sorting
|
|
184 (setq message-subject-re-regexp "^[ ]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ ]*\\)*\\(\\[[^]]*\\]\\)?[ ]*\\([Rr][Ee]\\(\\[[0-9]*\\]\\)*:[ ]*\\)*")
|
|
185
|
|
186 (custom-set-variables
|
|
187 '(gnus-treat-display-picons nil))
|
|
188 (custom-set-faces)
|
|
189
|
|
190 (require 'mm-decode)
|
|
191 (setq mm-automatic-display (remove "text/html" mm-automatic-display))
|
|
192
|
|
193 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
|
|
194
|
|
195 (add-hook 'gnus-summary-mode-hook 'gnus-summary-mode-fun1)
|
|
196
|
|
197 ;; run the first time we make a summary window
|
|
198 (defun gnus-summary-mode-fun1 ()
|
|
199 "install ht's mods"
|
|
200 (define-key gnus-summary-mode-map "D" 'ht-gnus-summary-delete-forward)
|
|
201 (define-key gnus-summary-mode-map "\M-d" 'gnus-edit-and-move-to-diary)
|
|
202 (define-key gnus-summary-mode-map "\M-e" 'gnus-extract-attachment)
|
|
203 (define-key gnus-summary-mode-map "\M-w" 'add-white)
|
|
204 (define-key gnus-summary-mode-map "\M-h" 'showMPAhtml)
|
|
205 (define-key gnus-summary-mode-map "~" 'mark-and-mark)
|
|
206 (remove-hook 'gnus-summary-mode-hook 'gnus-summary-mode-fun1))
|
|
207
|
|
208 (defun ht-gnus-pers-refresh (n)
|
|
209 (interactive "p")
|
|
210 (let ((gn (concat "nnml+ht:pers-"
|
|
211 (format-time-string "%Y-%m" (current-time)))))
|
|
212 (gnus-group-goto-group gn)
|
|
213 (gnus-group-get-new-news-this-group n)
|
|
214 (gnus-group-goto-group gn)
|
|
215 (gnus-group-read-group))
|
|
216 )
|
|
217
|
|
218 (add-hook 'gnus-group-mode-hook 'gnus-group-mode-fun1)
|
|
219
|
|
220 ;; run the first time we make a group window
|
|
221 (defun gnus-group-mode-fun1 ()
|
|
222 "install ht's mods"
|
|
223 (define-key gnus-group-mode-map "\M-\C-g" 'ht-gnus-pers-refresh)
|
|
224 (remove-hook 'gnus-group-mode-hook 'gnus-group-mode-fun1))
|
|
225
|
|
226 (defun gnus-user-format-function-t (header)
|
|
227 "display the to field (for archive messages)"
|
|
228 (let ((n (mail-header-number header)))
|
|
229 (with-current-buffer nntp-server-buffer
|
|
230 (save-excursion
|
|
231 (save-restriction
|
|
232 (let ((inhibit-point-motion-hooks t))
|
|
233 (goto-char (point-min))
|
|
234 (let ((beg (search-forward (format " %d Article retrieved." n)))
|
|
235 (end (search-forward "\n.\n")))
|
|
236 (narrow-to-region beg end)
|
|
237 (goto-char beg)
|
|
238 (message-fetch-field "To"))))))))
|
|
239
|
|
240 (defun showMPAhtml ()
|
|
241 "Show the text/html parts of an multipart/alternative message using lynx"
|
|
242 (interactive)
|
|
243 (gnus-summary-select-article)
|
|
244 (with-current-buffer gnus-original-article-buffer
|
|
245 (shell-command-on-region (point-min) (point-max) "/home/ht/bin/showMPA.sh")
|
|
246 )
|
|
247 )
|
|
248
|
|
249 (defun gnus-extract-attachment ()
|
|
250 "extract attachments from a multi-part mime message"
|
|
251 (interactive)
|
|
252 (let ((sm gnus-show-mime))
|
|
253 (if sm
|
|
254 (progn (setq gnus-show-mime nil)
|
|
255 (gnus-summary-select-article t 'force))
|
|
256 )
|
|
257 (gnus-article-show-all-headers)
|
|
258 (with-current-buffer gnus-article-buffer
|
|
259 (save-excursion
|
|
260 (save-restriction
|
|
261 (mime/viewer-mode)
|
|
262 (delete-other-windows)
|
|
263 (let ((pt 0))
|
|
264 (while (progn
|
|
265 (mime-viewer/next-content)
|
|
266 (and
|
|
267 (equal "*Preview-*Article**" (buffer-name (current-buffer)))
|
|
268 (not (= pt (point)))))
|
|
269 (setq pt (point))
|
|
270 (if (looking-at "^\\[[0-9]* \\([^ ]+ \\)+<")
|
|
271 (mime-viewer/extract-content)))))))
|
|
272 (kill-buffer "*Preview-*Article**")
|
|
273 (setq gnus-show-mime sm)
|
|
274 ))
|
|
275
|
|
276 (make-variable-buffer-local 'gnus-extra-headers)
|
|
277 (make-variable-buffer-local 'nnmail-extra-headers)
|
|
278 (add-hook 'gnus-parse-headers-hook
|
|
279 '(lambda ()
|
|
280 (gnus-summary-set-local-parameters gnus-newsgroup-name)))
|
|
281
|
|
282 (defun del-dups ()
|
|
283 (interactive)
|
|
284 (gnus-summary-sort-by-subject)
|
|
285 (gnus-summary-clear-mark-forward 1)
|
|
286 (goto-char (point-min))
|
|
287 (let ((pos))
|
|
288 (while (setq pos (search-forward "] " nil t))
|
|
289 (end-of-line)
|
|
290 (let ((subj (buffer-substring pos (point))))
|
|
291 (unless (equal subj "")
|
|
292 (let ((target (if (< (length subj) 26)
|
|
293 (concat "] " subj "\n")
|
|
294 (concat "] " (substring subj 0 25))))
|
|
295 (done 0)
|
|
296 (case-fold-search nil))
|
|
297 (while (and (= done 0)
|
|
298 (search-forward target nil t))
|
|
299 (forward-char -3)
|
|
300 (setq done (gnus-summary-mark-as-read-forward 1))))))))
|
|
301 (gnus-summary-limit-to-unread)
|
|
302 (gnus-summary-sort-by-original))
|
|
303
|
|
304 (add-hook 'gnus-get-new-news-hook (lambda () (setq ht-gnus-just-read nil)))
|
|
305
|
|
306 (add-hook 'gnus-after-getting-new-news-hook
|
|
307 (lambda () (message "%s" ht-gnus-just-read)))
|
|
308
|
|
309 (defvar ht-gnus-just-read nil)
|
|
310
|
|
311 (defun ht-gnus-note-save-to-group ()
|
|
312 (let ((g (caar group-art)))
|
|
313 (if (not (member g ht-gnus-just-read))
|
|
314 (setq ht-gnus-just-read (cons g ht-gnus-just-read)))))
|
|
315
|
|
316 (add-hook 'nnml-prepare-save-mail-hook (function ht-gnus-note-save-to-group))
|