;; -*- emacs-lisp -*- ;; Author: Olivier Tetard ;; URL : http://toutoune25.miskin.fr/ ;; This file 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 file 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 GNU Emacs; see the file COPYING. If not, write to the Free ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. ;; ,----[ *** Copyright et sources *** ] ;; | Ecrit par Olivier Tétard ;; | ;; | Il s'agit surtout d'un piochage dans differents .gnus ;; | ;; | A aller voir : ;; | o http://etudiant.epita.fr/~eole/emacs.html#gnus ;; | o http://gnusfr.apinc.org/ ;; | o http://mouarf.org/config/gnus/gnus ;; | o http://my.gnus.org ;; | o http://www.linux-france.org/article/appli/cfg/index.html ;; | o http://www.teaser.fr/~nchuche/gnus/index.html ;; `---- (require 'bbdb) (require 'bbdb-gnus) (require 'boxquote) (require 'gnus-cite) (require 'gnus-pers) ;;(require 'pgg) (require 'epa-setup) ;; (require 'epa-mail) (require 'spam) (require 'spam-report) ;; ,---- ;; | Repertoires ;; `---- (setq gnus-agent-directory "~/.gnus.d/agent") (setq gnus-article-save-directory "~/.gnus.d/archives") (setq gnus-cache-active-file "~/.gnus.d/news/active") (setq gnus-cache-directory "~/.gnus.d/cache") (setq gnus-default-directory "~") (setq gnus-directory "~/.gnus.d/news") (setq nntp-marks-directory "~/.gnus.d/news/marks") (setq gnus-home-directory "~/.gnus.d") (setq gnus-kill-files-directory "~/.gnus.d/score") (setq message-directory "~/.gnus.d/mail") (setq spam-directory "~/.gnus.d/spam/") ;; ,---- ;; | Parametres Personnels + Backends ;; `---- ;; Utilisation d'identités mutliples (gnus-personality-init) (setq gnus-personalities (quote (("default" "Olivier Tétard " "" "~/.gnus.d/signature") ("attac" "Attac Rennes " "" "~/.gnus.d/signature_attac")))) (setq user-full-name "Olivier Tétard") (setq user-mail-address "olivier.tetard@miskin.fr") (setq gnus-ignored-from-addresses '("toutoune25@.*" "olivier.tetard@miskin.fr" "tetaro@free.fr")) ;; Configuration du SMTP / AUTH TLS ;; Penser à installer le paquet starttls !! (setq send-mail-function 'smtpmail-send-it message-send-mail-function 'smtpmail-send-it) (setq smtpmail-smtp-server "mail.miskin.fr") (setq smtpmail-starttls-credentials '(("mail.miskin.fr" 25 nil nil))) (setq smtpmail-auth-credentials "~/.authinfo") (load-library "smtpmail") ;; Les backendz (setq gnus-select-method '(nnnil)) (setq gnus-secondary-select-methods '((nnimap "miskin" (nnimap-address "mail.miskin.fr") (nnimap-stream ssl) (remove-prefix "INBOX.") (nnimap-authinfo-file "~/.authinfo")) (nnml "localbox") (nntp "news.gmane.org"))) ;; (nnmaildir "localmaildir" (directory "~/.mail/helium.miskin.fr")))) ;; On ne cherche pas les nouveaux newsgroups (setq gnus-check-new-newsgroups nil) ;; On balance tout dans nnml:local (setq nnmail-split-methods '(("local" ""))) ;; On sauvegarde les mails dans Sent et on les marque comme lus (setq gnus-message-archive-group "nnimap+miskin:Sent") (setq gnus-gcc-mark-as-read t) ;; Face, stolen from: ;; http://www.mwolson.org/projects/emacs-config/dot_gnus.el.html ;; Specify headers that I want in every message (defun my-message-insert-extra-headers () (goto-char (point-min)) (insert "Face: " (gnus-convert-png-to-face "~/.gnus.d/fouine.png") "\n")) (add-hook 'message-header-setup-hook 'my-message-insert-extra-headers) ;; ,----[ *** Comportement de Gnus *** ] ;; | Lancement/Fermeture de Gnus ;; `---- ;; On ouvre automatiquement le fichier 'newsrc-dribble' (setq gnus-always-read-dribble-file t) ;; On lance GNUS en mode topic (add-hook 'gnus-group-mode-hook 'gnus-topic-mode) ;; On desactive l'abonnement automatique (setq gnus-default-subscribed-newsgroups nil) ;; On ne verifie pas les nouveaux groupes à chaque fois (setq gnus-check-new-newsgroups t) ;; On marche en mode 24H (custom-set-variables '(display-time-24hr-format t)) ;; On active le cache (setq gnus-use-cache t) ;; On desactive l'impression couleur (setq ps-print-color-p nil) ;; On veux quitter gnus proprement (defun clean-exit-emacs-with-gnus () "Save and exit Gnus before exiting Emacs" (interactive) (if (fboundp 'gnus-group-exit) (gnus-group-exit)) (save-buffers-kill-emacs t)) (global-set-key [(control x) (control c)] 'clean-exit-emacs-with-gnus) ;; ,----[ *** Comportement de Gnus *** ] ;; | Lecture d'un mail (*Group* et *Summary*) ;; `---- ;; On ne sauvegarde pas la liste des groupes tués (setq gnus-save-killed-list nil) ;; On affiche les groupes vides (setq gnus-permanently-visible-groups ".*") ;; On ne thread que sur les références (et non pas sur les sujets) ;; (setq gnus-summary-thread-gathering-function ;; 'gnus-gather-threads-by-references) ; Scorage des groupes les plus lus (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) ; Classer les groupes en fonction de leur hits (setq gnus-group-sort-function '(gnus-group-sort-by-unread gnus-group-sort-by-rank)) ;; Format des folders dans *Group* ;; On affiche l'heure de derniere lecture de la boite (add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) (setq gnus-group-line-format "%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") ;; On surligne la ligne courante dans *Group* et *Summary* (if window-system (progn (add-hook 'gnus-group-mode-hook 'highlight-current-line-minor-mode) (add-hook 'gnus-summary-mode-hook 'highlight-current-line-minor-mode) (custom-set-faces '(highlight-current-line-face ((t (:background "#6699cc"))))))) ;; Format des messages dans *Summary* ;; (setq gnus-sum-thread-tree-single-indent " ") (setq gnus-summary-line-format ":%U%R %B %s %-60= | %4L | %-20,20uB | %&user-date; \n") ; Quel article lire le premier lorsqu'on sélectionne le groupe ; avec ? ; - nil : N'affiche aucun message ; - best : L'article le mieux scoré ; - t : Le premier article non-lu. (setq gnus-auto-select-first 'nil) ;; nice summary threading from http://my.gnus.org/node/view/121 (if window-system (progn (setq gnus-sum-thread-tree-root "● ") (setq gnus-sum-thread-tree-false-root "◯ ") (setq gnus-sum-thread-tree-single-indent "◎ ") (setq gnus-sum-thread-tree-leaf-with-other "├─► ") (setq gnus-sum-thread-tree-vertical "│") (setq gnus-sum-thread-tree-single-leaf "╰─► ")) ;;; (setq gnus-sum-thread-tree-false-root "~ ") ;;; (setq gnus-sum-thread-tree-root "\x4912f ") ;;; (setq gnus-sum-thread-tree-single-indent "\x4912b ") ;;; (setq gnus-sum-thread-tree-leaf-with-other "\x4903c\x49020\x490fa ") ;;; (setq gnus-sum-thread-tree-vertical "\x49022") ;;; (setq gnus-sum-thread-tree-single-leaf "\x490b0\x49020\x490fa ")) (setq gnus-sum-thread-tree-root " >" gnus-sum-thread-tree-single-indent " " gnus-sum-thread-tree-vertical "|" gnus-sum-thread-tree-indent " " gnus-sum-thread-tree-leaf-with-other "+-> " gnus-sum-thread-tree-single-leaf "`-> ")) ;; On ne marque pas 36 fois les topics (setq gnus-summary-same-subject "") ;; Parametres des groupes (setq gnus-parameters '(("^nnimap\\+miskin:Sent.*" (gnus-summary-line-format ":%U%R %B %s %-60= | %4L | %-20,20f | %&user-date; \n")) ("^nnimap\\+miskin:MailingLists\\.*" (auto-expire . t) (total-expire . t)) ("^nnimap\\+miskin:MailingLists\\.ATTAC.*" (total-expire . DISABLE) (auto-expire . DISABLE) (expiry-wait . never)) ("^nnimap\\+miskin:Junk\\.*" (auto-expire . t) (total-expire . t)))) ;; Temps avant expiration (setq nnmail-expiry-wait 15) ;; On supprime les messages cross postés (setq gnus-suppress-duplicates t) ; Lorsqu'on 'kill' un thread, celui-ci est caché (setq gnus-thread-hide-killed t) ; Trier les threads en fonctions du score, puis par date (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date gnus-thread-sort-by-total-score)) ;; sauter le reste d'un article si c'est : citation + Signature (setq gnus-article-skip-boring t) ;; Replie les threads par défaut (setq gnus-thread-hide-subtree t) ;; permet de développer, respectivement réduire les threads en appuyant ;; sur la touche "flèche gauche", respectivement "flèche droite" ;; Sur une idée de Ingo Ruhnke (defun my-gnus-summary-show-thread () "Show thread without changing cursor positon." (interactive) (gnus-summary-show-thread) (beginning-of-line) (forward-char 1)) (define-key gnus-summary-mode-map [(right)] 'my-gnus-summary-show-thread) (define-key gnus-summary-mode-map [(left)] 'gnus-summary-hide-thread) ;; ,----[ *** Comportement de Gnus *** ] ;; | Lecture d'un mail (*Article*) ;; `---- ;; On n'affiche pas l'emetteur (add-to-list 'message-syntax-checks '(sender . disabled)) ;; Selection des headers à afficher (setq gnus-visible-headers "^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|Newsgroups:\\|To:\\|Cc:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\|Archived-At:\\)") ;; L'affichage des messages (setq gnus-article-display-hook '(gnus-article-hide-headers-if-wanted gnus-article-date-lapsed gnus-article-hide-pgp gnus-article-treat-overstrike gnus-article-de-quoted-unreadable gnus-article-strip-leading-blank-lines gnus-article-remove-trailing-blank-lines gnus-article-strip-multiple-blank-lines gnus-article-highlight gnus-article-highlight-signature gnus-article-emphasize gnus-article-fill-cited-article)) ;; Definition d'une signature ; Provient du manuel Gnus (Node 3.16.7) (setq gnus-signature-separator '("^-- $" ; The standard "^-- *$" ; A common mangling "----8<----" "^________*$" ; Underscores are also popular "^========*$" "^----- Original Message -----$" )) ; Ne pas inclure la signature lors d'une réponse (setq message-cite-function 'message-cite-original-without-signature) ;; On prefere le texte au HTML/RTF (eval-after-load "mm-decode" '(progn (add-to-list 'mm-discouraged-alternatives "text/html") (add-to-list 'mm-discouraged-alternatives "text/richtext"))) ;; On utilise W3M pour le rendu HTML ;;(setq mm-inline-text-html-renderer 'mm-inline-text-html-render-with-w3m) ;; On code les messages en latin-1 prioritairement (setq mm-coding-system-priorities '(iso-latin-1 iso-latin-9 mule-utf-8)) ;; Rendre un message plus propre (Outlook tu pues !) ;; http://my.gnus.org/node/view/94 (defun bhaak-wash-this-article () (interactive) (gnus-article-outlook-deuglify-article) (gnus-article-fill-cited-article nil '70) (gnus-article-capitalize-sentences)) (define-key gnus-summary-mode-map "w" 'bhaak-wash-this-article) ;; On active les smileys (add-hook 'gnus-article-display-hook 'gnus-smiley-display t) ;; On utilise Mozilla Firefox (defun browse-url-firefox-new-tab (url &optional new-window) "Open URL in a new tab in Firefox." ;; (interactive (browse-url-interactive-arg "URL: ")) (let ((cmd (shell-command-to-string (concat "mozilla-firefox -a firefox -remote 'openURL(" url ",new-tab)' > /dev/null")))) (unless (string= "" cmd) (message "Starting Firefox...") (start-process (concat "firefox " url) nil "/bin/sh" "-c" (concat "mozilla-firefox " url "|| true")) (message "Starting Firefox...done")))) (setq browse-url-browser-function 'browse-url-firefox-new-tab) ;; On ignore les types v-card (setq gnus-ignored-mime-types '("text/x-vcard")) ;; la coloration des articles (add-hook 'gnus-article-display-hook 'gnus-article-highlight) ;; vire le QP (add-hook 'gnus-article-display-hook 'gnus-article-de-quoted-unreadable) ;; cache les headers indésirables (add-hook 'gnus-article-display-hook 'gnus-article-hide-headers-if-wanted) ;; vire certains headers s'ils sont vides (add-hook 'gnus-article-display-hook 'gnus-article-hide-boring-headers) ;; vire les lignes blanches en tête (add-hook 'gnus-article-display-hook 'gnus-article-strip-leading-blank-lines) ;; vire les lignes blanches en queue (add-hook 'gnus-article-display-hook 'gnus-article-remove-trailing-blank-lines) ;; vire les lignes blanches en doubles (add-hook 'gnus-article-display-hook 'gnus-article-strip-multiple-blank-lines) ;; met en valeur les *machins* et autres _trucs_ (add-hook 'gnus-article-display-hook 'gnus-article-emphasize) ;; ,----[ *** Comportement de Gnus *** ] ;; | Scoring ;; `---- ;; Non, mais oh ! on va se laisser faire :o) (setq gnus-use-scoring t) ;; Suffixe employé pour les fichiers (setq gnus-score-file-suffix "Score") ;; Score par défault (setq gnus-summary-default-score 0) ;; Ne pas afficher le message, si le score < 500 (setq gnus-summary-expunge-below -499) ;; Méthode pour trouver le fichier Scorefile (setq gnus-score-find-score-files-function 'gnus-score-find-bnews) ;; Global score (http://www.xsteve.at/prg/gnus/) (setq gnus-global-score-files '("~/.gnus.d/score/all.Score")) ;; ,----[ *** Comportement de Gnus *** ] ;; | Ecriture d'un mail ;; `---- ;; Charset (setq gnus-default-charset (quote iso-8859-15)) (setq gnus-default-posting-charset (quote iso-8859-15)) ;; Dans les newsgroup, repondre à l'auteur ? (defadvice gnus-summary-reply (around reply-in-news activate) (interactive) (when (or (not (gnus-news-group-p gnus-newsgroup-name)) (y-or-n-p "Vraiment répondre à l'auteur ? ")) ad-do-it)) ;; On cite les mails avec '>' (custom-set-variables '(mail-yank-prefix "> ")) ;; On ecrit sur 72 cols automatiquement (add-hook 'message-mode-hook 'turn-on-auto-fill) ;; On ne veux pas de la signature en reponse (setq message-cite-function 'message-cite-original-without-signature) ;; On n'utilise que Gnus => pas de .newsrc : Utile ? (setq gnus-save-newsrc-file nil) (setq gnus-read-newsrc-file nil) ;; Dit le nom de la personne quand on cite (defun message-insert-citation-line () "La fonction qui insere une ligne aux reponses" (when message-reply-headers (insert (mail-header-from message-reply-headers) " a tapoté :\n\n"))) ;; colorisation syntaxique lorsqu'on repond a un mail. (add-hook 'message-mode-hook 'turn-on-font-lock) ;; colorier le buffer de réponse (add-hook 'gnus-message-setup-hook 'font-lock-fontify-buffer) ;; Configuration des plugins ;; ---------------------------------------------------------------------- ;; ,----[ *** BBDB *** ] ;; | Parametres ;; `---- (bbdb-initialize 'gnus 'message) (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) (bbdb-insinuate-message) ;; Ne pas utiliser la notation téléphonique US (setq bbdb-north-american-phone-numbers-p nil) ;; Pas de codes de localisations pour le telephone (setq bbdb-default-area-code nil) ;; On aide le scoring (setq gnus-score-find-score-files-function '(gnus-score-find-bnews bbdb/gnus-score)) ;; Pas de popups (setq bbdb-use-pop-up nil) ;; afficher les noms de bbdb plutot que celui du From: ;; (dans le summary) (setq bbdb/gnus-summary-prefer-real-names t) (setq bbdb/gnus-summary-prefer-bbdb-data t) ;; permet d'empecher a bbdb de creer une nouvelle entree a chaque fois ;; (setq bbdb/mail-auto-create-p t) ;; on déplace le fichier bbdb (setq bbdb-file "~/.gnus.d/bbdb") ;; Nombre de lignes dans la popup (setq bbdb-pop-up-target-lines 5) ;; Sauvegarder automatiquement la base (setq bbdb-offer-save nil) ;; On complete sur le nom (setq bbdb-completion-type 'primary-or-name) ;; permet de faire défiler les différentes adresses (setq bbdb-complete-name-allow-cycling t) ;; La completion des alias se fait avec TAB (define-key message-minibuffer-local-map (kbd "TAB") 'bbdb-complete-name) ;; ,----[ *** PGG ***] ;; | Configuration générale ;; `---- (setq mml2015-use 'epg) ;; Tells Gnus to inline the part (eval-after-load "mm-decode" '(add-to-list 'mm-inlined-types "application/pgp$")) ;; Tells Gnus how to display the part when it is requested (eval-after-load "mm-decode" '(add-to-list 'mm-inline-media-tests '("application/pgp$" mm-inline-text identity))) ;; Tell Gnus not to wait for a request, just display the thing ;; straight away. (eval-after-load "mm-decode" '(add-to-list 'mm-automatic-display "application/pgp$")) (setq gnus-buttonized-mime-types (quote ("multipart/encrypted" "multipart/signed"))) (setq message-setup-hook (quote (mml-secure-message-sign))) (setq mm-decrypt-option (quote known)) (setq mm-verify-option (quote known)) ;; ;; Récuperer les clés inconnues (à partir d'un serveur de clé) ;; (setq pgg-query-keyserver t) ;; (setq pgg-default-keyserver-address "pgp.mit.edu") ;; ;; On verifie/decripte seulement pour les protocoles connus ;; (setq mm-verify-option 'known) ;; (setq mm-decrypt-option 'known) ;; ;; On crée un bouton pour le "multipart/encrypted" (??) ;; (setq gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed")) ;; ;; On signe automatiquement les messages sortant ;; (add-hook 'message-send-hook 'mml-secure-message-sign-pgpmime) ;; ;; On sauvegarde le passphease 300 secs ;; (setq pgg-passphrase-cache-expiry 2000) ;; ;; Tells Gnus to inline the part ;; (eval-after-load "mm-decode" ;; '(add-to-list 'mm-inlined-types "application/pgp$")) ;; ;; Tells Gnus how to display the part when it is requested ;; (eval-after-load "mm-decode" ;; '(add-to-list 'mm-inline-media-tests '("application/pgp$" ;; mm-inline-text identity))) ;; ;; Tell Gnus not to wait for a request, just display the thing ;; ;; straight away. ;; (eval-after-load "mm-decode" ;; '(add-to-list 'mm-automatic-display "application/pgp$")) ;; ;; On n'affiche pas les signatures ;; (eval-after-load "mm-decode" ;; (quote (setq mm-automatic-display (remove "application/pgp-signature" ;; mm-automatic-display)))) ;; ;; cache les cles PGP ;; (add-hook 'gnus-article-display-hook 'gnus-article-hide-pgp) ;; ,----[ *** Spam ***] ;; | Configuration générale ;; `---- (spam-initialize) ;; On utilise gmane pour rapporter les spams (setq gnus-spam-process-newsgroups '(("^nntp\\+news\\.gmane\\.org:" ((spam spam-use-gmane))))) ;; Et on copie les mails dans le dossier de spam (setq gnus-spam-process-destinations '(;; ("^nntp\\+news\\.gmane\\.org:" "nnimap+miskin:Junk") ("^nnimap\\+miskin:*" "nnimap+miskin:Junk"))) ;; A trier et nouveautés ;; ---------------------------------------------------------------------- ;; Recherche rapide ;; http://my.gnus.org/book/view/217 (setq nbc-nnir t) ;; On cache tout ! ;; -> http://lists.gnu.org/archive/html/info-gnus-english/2005-01/msg00198.html (add-hook 'gnus-select-article-hook 'gnus-agent-fetch-selected-article)