3 ;; Author: Olivier Tetard <olivier.tetard@miskin.fr>
4 ;; URL : http://toutoune25.miskin.fr/
6 ;; This file is free software; you can redistribute it and/or modify it
7 ;; under the terms of the GNU General Public License as published by the
8 ;; Free Software Foundation; either version 2, or (at your option) any
11 ;; This file is distributed in the hope that it will be useful, but
12 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ;; General Public License for more details.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GNU Emacs; see the file COPYING. If not, write to the Free
18 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 ;; ,----[ *** Copyright et sources *** ]
22 ;; | Ecrit par Olivier Tétard
24 ;; | Il s'agit surtout d'un piochage dans differents .gnus
27 ;; | o http://etudiant.epita.fr/~eole/emacs.html#gnus
28 ;; | o http://gnusfr.apinc.org/
29 ;; | o http://mouarf.org/config/gnus/gnus
30 ;; | o http://my.gnus.org
31 ;; | o http://www.linux-france.org/article/appli/cfg/index.html
32 ;; | o http://www.teaser.fr/~nchuche/gnus/index.html
43 ;; (require 'epa-mail)
45 (require 'spam-report)
53 (setq gnus-agent-directory "~/.gnus.d/agent")
54 (setq gnus-article-save-directory "~/.gnus.d/archives")
55 (setq gnus-cache-active-file "~/.gnus.d/news/active")
56 (setq gnus-cache-directory "~/.gnus.d/cache")
57 (setq gnus-default-directory "~")
58 (setq gnus-directory "~/.gnus.d/news")
59 (setq nntp-marks-directory "~/.gnus.d/news/marks")
60 (setq gnus-home-directory "~/.gnus.d")
61 (setq gnus-kill-files-directory "~/.gnus.d/score")
62 (setq message-directory "~/.gnus.d/mail")
63 (setq spam-directory "~/.gnus.d/spam/")
67 ;; | Parametres Personnels + Backends
71 ;; Utilisation d'identités mutliples
72 (gnus-personality-init)
74 (setq gnus-personalities
77 "Olivier Tétard <olivier.tetard@miskin.fr>"
79 "~/.gnus.d/signature")
82 "Olivier Tétard <tetaro@free.fr>"
84 "~/.gnus.d/signature_tetaro")
87 "Olivier Tétard <olivier.tetard@etudiant.univ-rennes1.fr>"
89 "~/.gnus.d/signature_otetard"))))
91 (setq user-full-name "Olivier Tétard")
92 (setq user-mail-address "olivier.tetard@miskin.fr")
93 (setq gnus-ignored-from-addresses '("toutoune25@.*"
94 "olivier.tetard@miskin.fr"
97 ;; Configuration du SMTP / AUTH TLS
98 ;; Penser à installer le paquet starttls !!
99 (setq send-mail-function 'smtpmail-send-it
100 message-send-mail-function 'smtpmail-send-it)
101 (setq smtpmail-smtp-server "mail.miskin.fr")
102 (setq smtpmail-starttls-credentials '(("mail.miskin.fr" 25 nil nil)))
103 (setq smtpmail-auth-credentials "~/.authinfo")
104 (load-library "smtpmail")
107 (setq gnus-select-method '(nnnil))
109 (setq gnus-secondary-select-methods '((nnimap "miskin"
110 (nnimap-address "mail.miskin.fr")
112 (remove-prefix "INBOX.")
113 (nnimap-authinfo-file "~/.authinfo"))
115 (nntp "news.gmane.org")))
116 ;; (nnmaildir "localmaildir" (directory "~/.mail/helium.miskin.fr"))))
118 ;; On ne cherche pas les nouveaux newsgroups
119 (setq gnus-check-new-newsgroups nil)
121 ;; On balance tout dans nnml:local
122 (setq nnmail-split-methods
125 ;; On sauvegarde les mails dans Sent et on les marque comme lus
126 (setq gnus-message-archive-group "nnimap+miskin:Sent")
127 (setq gnus-gcc-mark-as-read t)
129 ;; Face, stolen from:
130 ;; http://www.mwolson.org/projects/emacs-config/dot_gnus.el.html
132 ;; Specify headers that I want in every message
133 (defun my-message-insert-extra-headers ()
134 (goto-char (point-min))
135 (insert "Face: " (gnus-convert-png-to-face "~/.gnus.d/fouine.png") "\n"))
137 (add-hook 'message-header-setup-hook 'my-message-insert-extra-headers)
140 ;; ,----[ *** Comportement de Gnus *** ]
141 ;; | Lancement/Fermeture de Gnus
144 ;; On ouvre automatiquement le fichier 'newsrc-dribble'
145 (setq gnus-always-read-dribble-file t)
147 ;; On lance GNUS en mode topic
148 (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
150 ;; On desactive l'abonnement automatique
151 (setq gnus-default-subscribed-newsgroups nil)
153 ;; On ne verifie pas les nouveaux groupes à chaque fois
154 (setq gnus-check-new-newsgroups t)
156 ;; On marche en mode 24H
157 (custom-set-variables '(display-time-24hr-format t))
159 ;; On active le cache
160 (setq gnus-use-cache t)
162 ;; On desactive l'impression couleur
163 (setq ps-print-color-p nil)
165 ;; On veux quitter gnus proprement
166 (defun clean-exit-emacs-with-gnus ()
167 "Save and exit Gnus before exiting Emacs"
169 (if (fboundp 'gnus-group-exit)
171 (save-buffers-kill-emacs t))
173 (global-set-key [(control x) (control c)]
174 'clean-exit-emacs-with-gnus)
177 ;; ,----[ *** Comportement de Gnus *** ]
178 ;; | Lecture d'un mail (*Group* et *Summary*)
182 ;; On ne sauvegarde pas la liste des groupes tués
183 (setq gnus-save-killed-list nil)
185 ;; On affiche les groupes vides
186 (setq gnus-permanently-visible-groups ".*")
188 ;; On ne thread que sur les références (et non pas sur les sujets)
189 ;; (setq gnus-summary-thread-gathering-function
190 ;; 'gnus-gather-threads-by-references)
192 ; Scorage des groupes les plus lus
193 (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
195 ; Classer les groupes en fonction de leur hits
196 (setq gnus-group-sort-function '(gnus-group-sort-by-unread
197 gnus-group-sort-by-rank))
199 ;; Format des folders dans *Group*
200 ;; On affiche l'heure de derniere lecture de la boite
201 (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
202 (setq gnus-group-line-format
203 "%M%S%p%P%5y: %(%G%) %l %O [%2,2~(cut 6)d/%2,2~(cut 4)d à %2,2~(cut 9)dh%2,2~(cut 11)d]\n")
205 ;; On surligne la ligne courante dans *Group* et *Summary*
208 (add-hook 'gnus-group-mode-hook 'highlight-current-line-minor-mode)
209 (add-hook 'gnus-summary-mode-hook 'highlight-current-line-minor-mode)
210 (custom-set-faces '(highlight-current-line-face ((t (:background "#6699cc")))))))
212 ;; Format des messages dans *Summary*
213 ;; (setq gnus-sum-thread-tree-single-indent " ")
214 (setq gnus-summary-line-format ":%U%R %B %s %-60= | %4L | %-20,20uB | %&user-date; \n")
216 ; Quel article lire le premier lorsqu'on sélectionne le groupe
218 ; - nil : N'affiche aucun message
219 ; - best : L'article le mieux scoré
220 ; - t : Le premier article non-lu.
221 (setq gnus-auto-select-first 'nil)
223 ;; nice summary threading from http://my.gnus.org/node/view/121
226 (setq gnus-sum-thread-tree-root "● ")
227 (setq gnus-sum-thread-tree-false-root "◯ ")
228 (setq gnus-sum-thread-tree-single-indent "◎ ")
229 (setq gnus-sum-thread-tree-leaf-with-other "├─► ")
230 (setq gnus-sum-thread-tree-vertical "│")
231 (setq gnus-sum-thread-tree-single-leaf "╰─► "))
232 ;;; (setq gnus-sum-thread-tree-false-root "~ ")
233 ;;; (setq gnus-sum-thread-tree-root "\x4912f ")
234 ;;; (setq gnus-sum-thread-tree-single-indent "\x4912b ")
235 ;;; (setq gnus-sum-thread-tree-leaf-with-other "\x4903c\x49020\x490fa ")
236 ;;; (setq gnus-sum-thread-tree-vertical "\x49022")
237 ;;; (setq gnus-sum-thread-tree-single-leaf "\x490b0\x49020\x490fa "))
239 (setq gnus-sum-thread-tree-root " >"
240 gnus-sum-thread-tree-single-indent " "
241 gnus-sum-thread-tree-vertical "|"
242 gnus-sum-thread-tree-indent " "
243 gnus-sum-thread-tree-leaf-with-other "+-> "
244 gnus-sum-thread-tree-single-leaf "`-> "))
246 ;; On ne marque pas 36 fois les topics
247 (setq gnus-summary-same-subject "")
249 ;; Parametres des groupes
250 (setq gnus-parameters
251 '(("^nnimap\\+miskin:Sent.*"
252 (gnus-summary-line-format ":%U%R %B %s %-60= | %4L | %-20,20f | %&user-date; \n"))
253 ("^nnimap\\+miskin:MailingLists\\.*"
256 ("^nnimap\\+miskin:MailingLists\\.ATTAC.*"
257 (total-expire . DISABLE)
258 (auto-expire . DISABLE)
259 (expiry-wait . never))
260 ("^nnimap\\+miskin:Junk\\.*"
262 (total-expire . t))))
264 ;; Temps avant expiration
265 (setq nnmail-expiry-wait 15)
267 ;; On supprime les messages cross postés
268 (setq gnus-suppress-duplicates t)
270 ; Lorsqu'on 'kill' un thread, celui-ci est caché
271 (setq gnus-thread-hide-killed t)
273 ; Trier les threads en fonctions du score, puis par date
274 (setq gnus-thread-sort-functions
275 '(gnus-thread-sort-by-date
276 gnus-thread-sort-by-total-score))
278 ;; sauter le reste d'un article si c'est : citation + Signature
279 (setq gnus-article-skip-boring t)
281 ;; Replie les threads par défaut
282 (setq gnus-thread-hide-subtree t)
284 ;; permet de développer, respectivement réduire les threads en appuyant
285 ;; sur la touche "flèche gauche", respectivement "flèche droite"
286 ;; Sur une idée de Ingo Ruhnke <grumbel@gmx.de>
287 (defun my-gnus-summary-show-thread ()
288 "Show thread without changing cursor positon."
290 (gnus-summary-show-thread)
294 (define-key gnus-summary-mode-map [(right)] 'my-gnus-summary-show-thread)
295 (define-key gnus-summary-mode-map [(left)] 'gnus-summary-hide-thread)
298 ;; ,----[ *** Comportement de Gnus *** ]
299 ;; | Lecture d'un mail (*Article*)
303 ;; On n'affiche pas l'emetteur
304 (add-to-list 'message-syntax-checks '(sender . disabled))
306 ;; Selection des headers à afficher
307 (setq gnus-visible-headers
308 "^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|Newsgroups:\\|To:\\|Cc:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\|Archived-At:\\)")
310 ;; L'affichage des messages
311 (setq gnus-article-display-hook '(gnus-article-hide-headers-if-wanted
312 gnus-article-date-lapsed
313 gnus-article-hide-pgp
314 gnus-article-treat-overstrike
315 gnus-article-de-quoted-unreadable
316 gnus-article-strip-leading-blank-lines
317 gnus-article-remove-trailing-blank-lines
318 gnus-article-strip-multiple-blank-lines
319 gnus-article-highlight
320 gnus-article-highlight-signature
321 gnus-article-emphasize
322 gnus-article-fill-cited-article))
324 ;; Definition d'une signature
325 ; Provient du manuel Gnus (Node 3.16.7)
326 (setq gnus-signature-separator
327 '("^-- $" ; The standard
328 "^-- *$" ; A common mangling
330 "^________*$" ; Underscores are also popular
332 "^----- Original Message -----$"
335 ; Ne pas inclure la signature lors d'une réponse
336 (setq message-cite-function 'message-cite-original-without-signature)
338 ;; On prefere le texte au HTML/RTF
339 (eval-after-load "mm-decode"
341 (add-to-list 'mm-discouraged-alternatives "text/html")
342 (add-to-list 'mm-discouraged-alternatives "text/richtext")))
344 ;; On utilise W3M pour le rendu HTML
345 ;;(setq mm-inline-text-html-renderer 'mm-inline-text-html-render-with-w3m)
347 ;; On code les messages en latin-1 prioritairement
348 (setq mm-coding-system-priorities
349 '(iso-latin-1 iso-latin-9 mule-utf-8))
351 ;; Rendre un message plus propre (Outlook tu pues !)
352 ;; http://my.gnus.org/node/view/94
353 (defun bhaak-wash-this-article ()
355 (gnus-article-outlook-deuglify-article)
356 (gnus-article-fill-cited-article nil '70)
357 (gnus-article-capitalize-sentences))
358 (define-key gnus-summary-mode-map "w" 'bhaak-wash-this-article)
360 ;; On active les smileys
361 (add-hook 'gnus-article-display-hook 'gnus-smiley-display t)
363 ;; On utilise Mozilla Firefox
364 (defun browse-url-firefox-new-tab (url &optional new-window)
365 "Open URL in a new tab in Firefox."
366 ;; (interactive (browse-url-interactive-arg "URL: "))
367 (let ((cmd (shell-command-to-string
368 (concat "mozilla-firefox -a firefox -remote 'openURL("
369 url ",new-tab)' > /dev/null"))))
370 (unless (string= "" cmd)
371 (message "Starting Firefox...")
372 (start-process (concat "firefox " url) nil "/bin/sh" "-c"
373 (concat "mozilla-firefox " url "|| true"))
374 (message "Starting Firefox...done"))))
376 (setq browse-url-browser-function 'browse-url-firefox-new-tab)
378 ;; On ignore les types v-card
379 (setq gnus-ignored-mime-types '("text/x-vcard"))
381 ;; la coloration des articles
382 (add-hook 'gnus-article-display-hook 'gnus-article-highlight)
385 (add-hook 'gnus-article-display-hook 'gnus-article-de-quoted-unreadable)
387 ;; cache les headers indésirables
388 (add-hook 'gnus-article-display-hook 'gnus-article-hide-headers-if-wanted)
390 ;; vire certains headers s'ils sont vides
391 (add-hook 'gnus-article-display-hook 'gnus-article-hide-boring-headers)
393 ;; vire les lignes blanches en tête
394 (add-hook 'gnus-article-display-hook 'gnus-article-strip-leading-blank-lines)
396 ;; vire les lignes blanches en queue
397 (add-hook 'gnus-article-display-hook 'gnus-article-remove-trailing-blank-lines)
399 ;; vire les lignes blanches en doubles
400 (add-hook 'gnus-article-display-hook 'gnus-article-strip-multiple-blank-lines)
402 ;; met en valeur les *machins* et autres _trucs_
403 (add-hook 'gnus-article-display-hook 'gnus-article-emphasize)
406 ;; ,----[ *** Comportement de Gnus *** ]
411 ;; Non, mais oh ! on va se laisser faire :o)
412 (setq gnus-use-scoring t)
414 ;; Suffixe employé pour les fichiers
415 (setq gnus-score-file-suffix "Score")
418 (setq gnus-summary-default-score 0)
420 ;; Ne pas afficher le message, si le score < 500
421 (setq gnus-summary-expunge-below -499)
423 ;; Méthode pour trouver le fichier Scorefile
424 (setq gnus-score-find-score-files-function 'gnus-score-find-bnews)
426 ;; Global score (http://www.xsteve.at/prg/gnus/)
427 (setq gnus-global-score-files
428 '("~/.gnus.d/score/all.Score"))
431 ;; ,----[ *** Comportement de Gnus *** ]
432 ;; | Ecriture d'un mail
437 (setq gnus-default-charset (quote iso-8859-15))
438 (setq gnus-default-posting-charset (quote iso-8859-15))
440 ;; Dans les newsgroup, repondre à l'auteur ?
441 (defadvice gnus-summary-reply (around reply-in-news activate)
443 (when (or (not (gnus-news-group-p gnus-newsgroup-name))
444 (y-or-n-p "Vraiment répondre à l'auteur ? "))
447 ;; On cite les mails avec '>'
448 (custom-set-variables '(mail-yank-prefix "> "))
450 ;; On ecrit sur 72 cols automatiquement
451 (add-hook 'message-mode-hook 'turn-on-auto-fill)
453 ;; On ne veux pas de la signature en reponse
454 (setq message-cite-function 'message-cite-original-without-signature)
456 ;; On n'utilise que Gnus => pas de .newsrc : Utile ?
457 (setq gnus-save-newsrc-file nil)
458 (setq gnus-read-newsrc-file nil)
460 ;; Dit le nom de la personne quand on cite
461 (defun message-insert-citation-line ()
462 "La fonction qui insere une ligne aux reponses"
463 (when message-reply-headers
464 (insert (mail-header-from message-reply-headers) " a tapoté :\n\n")))
466 ;; colorisation syntaxique lorsqu'on repond a un mail.
467 (add-hook 'message-mode-hook 'turn-on-font-lock)
469 ;; colorier le buffer de réponse
470 (add-hook 'gnus-message-setup-hook 'font-lock-fontify-buffer)
473 ;; Configuration des plugins
474 ;; ----------------------------------------------------------------------
477 ;; ,----[ *** BBDB *** ]
482 (bbdb-initialize 'gnus 'message)
484 (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
485 (bbdb-insinuate-message)
487 ;; Ne pas utiliser la notation téléphonique US
488 (setq bbdb-north-american-phone-numbers-p nil)
490 ;; Pas de codes de localisations pour le telephone
491 (setq bbdb-default-area-code nil)
493 ;; On aide le scoring
494 (setq gnus-score-find-score-files-function
495 '(gnus-score-find-bnews bbdb/gnus-score))
498 (setq bbdb-use-pop-up nil)
500 ;; afficher les noms de bbdb plutot que celui du From:
502 (setq bbdb/gnus-summary-prefer-real-names t)
503 (setq bbdb/gnus-summary-prefer-bbdb-data t)
505 ;; permet d'empecher a bbdb de creer une nouvelle entree a chaque fois
506 ;; (setq bbdb/mail-auto-create-p t)
508 ;; on déplace le fichier bbdb
509 (setq bbdb-file "~/.gnus.d/bbdb")
511 ;; Nombre de lignes dans la popup
512 (setq bbdb-pop-up-target-lines 5)
514 ;; Sauvegarder automatiquement la base
515 (setq bbdb-offer-save nil)
517 ;; On complete sur le nom
518 (setq bbdb-completion-type 'primary-or-name)
520 ;; permet de faire défiler les différentes adresses
521 (setq bbdb-complete-name-allow-cycling t)
523 ;; La completion des alias se fait avec TAB
524 (define-key message-minibuffer-local-map (kbd "TAB") 'bbdb-complete-name)
527 ;; ,----[ *** PGG ***]
528 ;; | Configuration générale
531 (setq mml2015-use 'epg)
533 ;; Tells Gnus to inline the part
534 (eval-after-load "mm-decode"
535 '(add-to-list 'mm-inlined-types "application/pgp$"))
537 ;; Tells Gnus how to display the part when it is requested
538 (eval-after-load "mm-decode"
539 '(add-to-list 'mm-inline-media-tests '("application/pgp$"
540 mm-inline-text identity)))
542 ;; Tell Gnus not to wait for a request, just display the thing
544 (eval-after-load "mm-decode"
545 '(add-to-list 'mm-automatic-display "application/pgp$"))
547 (setq gnus-buttonized-mime-types (quote ("multipart/encrypted" "multipart/signed")))
548 (setq message-setup-hook (quote (mml-secure-message-sign)))
549 (setq mm-decrypt-option (quote known))
550 (setq mm-verify-option (quote known))
552 ;; ;; Récuperer les clés inconnues (à partir d'un serveur de clé)
553 ;; (setq pgg-query-keyserver t)
554 ;; (setq pgg-default-keyserver-address "pgp.mit.edu")
556 ;; ;; On verifie/decripte seulement pour les protocoles connus
557 ;; (setq mm-verify-option 'known)
558 ;; (setq mm-decrypt-option 'known)
560 ;; ;; On crée un bouton pour le "multipart/encrypted" (??)
561 ;; (setq gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed"))
563 ;; ;; On signe automatiquement les messages sortant
564 ;; (add-hook 'message-send-hook 'mml-secure-message-sign-pgpmime)
566 ;; ;; On sauvegarde le passphease 300 secs
567 ;; (setq pgg-passphrase-cache-expiry 2000)
569 ;; ;; Tells Gnus to inline the part
570 ;; (eval-after-load "mm-decode"
571 ;; '(add-to-list 'mm-inlined-types "application/pgp$"))
573 ;; ;; Tells Gnus how to display the part when it is requested
574 ;; (eval-after-load "mm-decode"
575 ;; '(add-to-list 'mm-inline-media-tests '("application/pgp$"
576 ;; mm-inline-text identity)))
578 ;; ;; Tell Gnus not to wait for a request, just display the thing
580 ;; (eval-after-load "mm-decode"
581 ;; '(add-to-list 'mm-automatic-display "application/pgp$"))
583 ;; ;; On n'affiche pas les signatures
584 ;; (eval-after-load "mm-decode"
585 ;; (quote (setq mm-automatic-display (remove "application/pgp-signature"
586 ;; mm-automatic-display))))
587 ;; ;; cache les cles PGP
588 ;; (add-hook 'gnus-article-display-hook 'gnus-article-hide-pgp)
591 ;; ,----[ *** Spam ***]
592 ;; | Configuration générale
597 ;; On utilise gmane pour rapporter les spams
598 (setq gnus-spam-process-newsgroups
599 '(("^nntp\\+news\\.gmane\\.org:"
600 ((spam spam-use-gmane)))))
602 ;; Et on copie les mails dans le dossier de spam
603 (setq gnus-spam-process-destinations
604 '(;; ("^nntp\\+news\\.gmane\\.org:" "nnimap+miskin:Junk")
605 ("^nnimap\\+miskin:*" "nnimap+miskin:Junk")))
607 ;; A trier et nouveautés
608 ;; ----------------------------------------------------------------------
611 ;; http://my.gnus.org/book/view/217
615 ;; -> http://lists.gnu.org/archive/html/info-gnus-english/2005-01/msg00198.html
616 (add-hook 'gnus-select-article-hook
617 'gnus-agent-fetch-selected-article)