GNU Emacs::Der Mail- und Newsreader Gnus

.gnus

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;                    Gnus Konfiguration                   ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;
;; Allgemein ;;
;;;;;;;;;;;;;;;

; Leafnode als News-Server
(setq gnus-select-method '(nntp "localhost")

; ganz allgemeine Einstellungen
      user-mail-address "olli@sopos.org"
      user-full-name "Oliver Heins"

; wir fragen den Server nach neuen Newsgroups, das ist schneller, als
; wenn Gnus das herausfinden muss
      gnus-check-new-newsgroups 'ask-server
; und dann gibt es eigentlich auch keinen Grund mehr für killed-groups
      gnus-save-killed-list nil

; wenn es eine Backup-Datei gibt, soll die gelesen werden, ohne den
; Benutzer zu nerven
      gnus-always-read-dribble-file t

; Agent brauchen wir doch, um große Gruppen zu cachen
      gnus-agent t

; Wir wollen Mails lesen
      gnus-secondary-select-methods '((nnml ""))

; die Mail liegt in /var/mail/olli
      mail-sources '((file))

; Das Verzeichnis, von dem alle Datei-Variablen abgeleitet werden
      gnus-directory "~/News/"
                         
; Hier werden Artikel gespeichert
      gnus-article-save-directory (concat gnus-directory "save/")

; Und hier die Killfiles 
      gnus-kill-files-directory (concat gnus-directory "killfiles/"))

; Auch gmane soll abgefragt werden
(add-to-list 'gnus-secondary-select-methods
             '(nntp "news.gmane.org"))

; Einen Timer starten
(gnus-start-date-timer)

; Wir wollen PGG
(require 'pgg)
(setq pgg-cache-passphrase t
      pgg-passphrase-cache-expiry 600
      pgg-gpg-use-agent t
      pgg-default-user-id "0x9a00d827")

; spam.el
(spam-initialize)
(setq spam-use-whitelist t        ; Whitelisten benutzen
      spam-use-BBDB t             ; Wer in der BBDB ist, wird nicht gefiltert
      spam-use-regex-headers t)   ; catch X-Spam-Flag (SpamAssassin)


;;;;;;;;;;;;;;;;;;
;; Group Buffer ;;
;;;;;;;;;;;;;;;;;;

; Gruppen sollen hierarchisch sortiert werden können (topic-mode)
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)

; Formatierung der group-line
; zunächst soll sich Gnus merken, wann eine Gruppe zuletzt besucht
; wurde
(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp)
; jetzt die eigentliche group-line
(setq gnus-group-line-format
      "%M\%S\%p\%P\%5y: %(%-40,40G%) %ud\n")
; und die Zeitausgabe formitieren
(defun gnus-user-format-function-d (headers)
  (let ((time (gnus-group-timestamp gnus-tmp-group)))
    (if time
	(format-time-string "%b %d  %H:%M" time)
      "")))


;;;;;;;;;;;;;;;;;;;;
;; Summary Buffer ;;
;;;;;;;;;;;;;;;;;;;;

; summary-line
(setq gnus-user-date-format-alist 
      '(((gnus-seconds-today) . "    %k:%M")               ; heute (14:39)
	((+ 86400 (gnus-seconds-today)) . "gestern %k:%M") ; gestern 14:39 
	((+ 604800 (gnus-seconds-today)) . "%a  %k:%M")    ;  sam  14:39 
	((gnus-seconds-month) . "%a  %d")                  ;  sam  28 
	((gnus-seconds-year) . "%b %d")                    ;  mai  28 
	(t . "%b %d '%y"))                                 ;  mai  28 '05 

      gnus-summary-line-format 
      (concat 
       "%*%U%R%z"
       "%-14&user-date;" 
       "%[%4L%] %*"
       "%(%-24,24f %)" 
       "%1{ %B%s%}\n"))

; Faces zum Unterscheiden der Ebenen
(copy-face 'default 'mysubject) 
(set-face-foreground 'mysubject "indianred") 
(setq gnus-face-1 'mysubject)
 
(copy-face 'default 'mytime) 
(set-face-foreground 'mytime "green") 
(setq gnus-face-2 'mytime)

;; Grafische Bäume
(setq gnus-sum-thread-tree-root "\x4912f "                           ; "> " 
      gnus-sum-thread-tree-false-root "\x490f8 "                     ; "> " 
      gnus-sum-thread-tree-single-indent "  "                        ; "" 
      gnus-sum-thread-tree-leaf-with-other "\x4903c\x49020\x490fa "  ; "+-> " 
      gnus-sum-thread-tree-single-leaf "\x490b0\x49020\x490fa "      ; "\-> " 
      gnus-sum-thread-tree-vertical "\x49022"                        ; "| " 

; Sortiere Threads
      gnus-thread-sort-functions
      '(gnus-thread-sort-by-number
	gnus-thread-sort-by-total-score))

; Den ersten Thread einer Gruppe nicht automatisch expandieren
(setq gnus-auto-select-first 'unseen-or-unread)
(add-hook 'gnus-summary-prepared-hook 'gnus-summary-hide-all-threads)

; Alte Header sollen gefetcht werden, um die Threadanzeige zu verbessern
(setq gnus-fetch-old-headers 'some

; Bei eigenen Artikeln darf der Name in der Anzeige unterdrückt werden
      gnus-ignored-from-adresses "Oliver Heins"

; Summary Buffer Mode Line
      gnus-summary-mode-line-format "Gnus: %G [%A] %Z"

; Caching einschalten für persistente Artikel (Mark: *; Unmark M-*)
      gnus-use-cache 'passive

; Zumindest die digitale Signatur eines Artikels soll gezeigt werden
      gnus-buttonized-mime-types '("multipart/signed")

; Ältere Artikel sollen nach Möglichkeit vom Server gefetcht werden --
; und wenn dies fehlschlägt von Google
      gnus-refer-article-method
      `(current
        ,(gnus-server-to-method "nnml:sent-mail")   ; lokales Archiv
        ,(gnus-server-to-method "nnml:")            ; normale Mails
        (nntp "localhost")                          ; lokaler Newsserver
        (nnweb "refer" (nnweb-type google)))

; Ein Pfeil in der Fringe soll den aktuell gewählten Artikel
; kennzeichnen
      gnus-summary-display-arrow t)


;;;;;;;;;;;;;;;;;;;;
;; Article Buffer ;;
;;;;;;;;;;;;;;;;;;;;

; Boring headers
(setq gnus-treat-hide-boring-headers 'head
      gnus-boring-article-headers
      '(empty followup-to reply-to long-to)

; Leere Zeilen aus Artikeln entfernen
      gnus-treat-strip-leading-blank-lines t
      gnus-treat-strip-multiple-blank-lines t
      gnus-treat-strip-trailing-blank-lines t

; Umbrochene URLs "entbrechen"
      gnus-treat-unsplit-urls nil
      
; Datum soll einerseits als lokale Zeit, andererseits wie lang es her
; ist angezeigt werden
      gnus-treat-date-local 'head
      gnus-treat-date-lapsed 'head
      gnus-article-date-lapsed-new-header t

; ein paar Verschönerungen
      gnus-treat-display-smileys t
      gnus-treat-display-x-face 'head
      gnus-treat-display-face 'head
      gnus-treat-emphasize t)


;;;;;;;;;;;;;;;;;;;;
;; Message Buffer ;;
;;;;;;;;;;;;;;;;;;;;

;; enable automagic wordwrap for composing articles
(add-hook 'message-mode-hook
	  (lambda ()
	    (setq fill-column 72)
	    (turn-on-auto-fill)
	    (define-key message-mode-map (kbd "C-c [") ; RefTeX
	      (lambda () (interactive)
		(require 'reftex)
		(let ((reftex-cite-format "(%2a: %t, %j %v, %p, %2e: %b, %v, %r: %u, %s %d %y%<)"))
		  (reftex-citation))))))

;; footnote-mode
(autoload 'footnote-mode "footnote" nil t)
(add-hook 'message-mode-hook 'footnote-mode)


;;;;;;;;;;;
;; Mails ;;
;;;;;;;;;;;

;; Messages sollen archiviert werden -- und zwar nach Möglichkeit auch 
;; in der Gruppe, in der sie verfasst wurden
; Thanks to Reiner Steib
(defun rs-gnus-message-archive-group-oh (group-current)
  "Return preferred archive group."
  ;; See thread around the following MIDs for more info:
  ;; <news:87slkqnmyz.fsf@sopos.org>
  (let ((gcc1 (when (gnus-check-backend-function
		     'request-move-article group-current)
		group-current))
	(gcc2 (if (message-news-p)
		  "nnml+private:sent-news"
		"nnml+private:sent-mail")))
    ;; Don't gcc to current group, if it's a mailing list:
    (when (and gcc1
	       (string-match "\<list\." group-current))
      (setq gcc1 nil))
    (cond ((and gcc1 gcc2)
	   (list gcc1 gcc2))
	  (gcc1 gcc1)
	  (gcc2 gcc2)
	  (t nil))))

(setq gnus-message-archive-group 'rs-gnus-message-archive-group-oh)

;; Mail Splitting
; Gebräuchliche Abkürzungen erweitern
(setq nnmail-split-abbrev-alist
      '((any . "List-Post\|X-unsubscribe\|from\|to\|cc\|sender\\
|apparently-to\|delivered-to\|x-apparently-to\|resent-from\\
|resent-to\|resent-cc") 
	(mail . "mailer-daemon\|postmaster\|uucp") 
	(to . "to\|cc\|apparently-to\|resent-to\|resent-cc\\ 
|delivered-to\|x-apparently-to")
	(from . "from\|sender\|resent-from") 
	(nato . "to\|cc\|resent-to\|resent-cc") 
	(naany . "from\|to\|cc\|sender\|resent-from\|resent-to\|resent-cc")
        (ml . "resent-from\|resent-to\|resent-cc\|cc\|X-Original-To\\
|List-Post\|X-unsubscribe\|X-BeenThere\|List-Id\|X-Loop\|X-Mailing\
-List\|To\|List-Post")))

(setq nnmail-split-methods 'nnmail-split-fancy
      nnmail-treat-duplicates 'warn
      nnmail-cache-accepted-message-ids t
      nnmail-cache-ignore-groups  '("^sent-mail$" 
				    "^sent-news$" 
				    "^drafts$")
      nnmail-message-id-cache-length 5000
      nnmail-split-fancy
      '(| (: spam-split) ; Spam
	  ("X-Spam-Flag" "YES" "spam")
	  (: nnmail-split-fancy-with-parent)
	  (ml "debian-\([-a-zA-Z_\]+\)@lists.debian.org.*" "list.debian-\1")
	  (ml "cacert\(-?[-a-zA-Z_\]*\)@lists.cacert.org.*" "list.cacert\1")
	  (to "GMX Kundennummer" "spam")
	  (from "mailings@gmx.net" "spam")
	  (to "redaktion@sopos.org" "Sopos.Redaktion")
	  "inbox"))

; Ich will HTML-Mails möglichst als Plaintext angezeigt bekommen
(eval-after-load "mm-decode"
  '(progn
     (add-to-list 'mm-discouraged-alternatives "text/html")
     (add-to-list 'mm-discouraged-alternatives "text/richtext")))

; Und wenns sein muss, soll w3m die Mails formatieren
(setq mm-text-html-renderer 'w3m-standalone)


;;;;;;;;;;;;;
;; Message ;;
;;;;;;;;;;;;;

; xfaces sehen einfach hässlich aus, wenn sie in ner
; Konfigurationsdatei stehen.  Auslagern.
(defun xface-insert ()
  (with-temp-buffer nil
		    (insert-file-contents "~/.xface")
		    (buffer-string)))

(setq message-subject-re-regexp ; Kaputte Re: auffinden
      (concat
       "^[ \t]*"
       "\("
       "\("
       "[Aa][Nn][Tt][Ww]\.?\|"     ; antw
       "[Aa][Ww]\|"                 ; aw
       "[Ff][Ww][Dd]?\|"            ; fwd
       "[Oo][Dd][Pp]\|"             ; odp
       "[Rr][Ee]\|"                 ; re
       "[Rr][\311\351][Ff]\.?\|"   ; ref
       "[Ss][Vv]"                    ; sv
       "\)"
       "\(\[[0-9]*\]\)"
       "*:[ \t]*"
       "\)"
       "*[ \t]*"
       )
      message-subject-trailing-was-query t ; lösche (was: ...) in Antworten
      message-alternative-emails ; diese Adressen sollen im Falle eines Reply
      (regexp-opt '("heins@sopos.org" "webmaster@sopos.org" ; beibehalten
		    "webmaster@offizinverlag.de"))          ; werden
      message-cite-function 'message-cite-original-without-signature ; Signatur
      message-signature t                                            ; strippen
      message-signature-insert-empty-line t

      message-required-news-headers  ; Mein Face
      (nconc message-required-news-headers
	     (list '(Face . (lambda ()
			      (gnus-face-from-file "~/face.jpg")))))
      message-required-mail-headers  ; Mein Face
      (nconc message-required-mail-headers
	     (list '(Face . (lambda ()
			      (gnus-face-from-file "~/face.jpg")))))

      message-required-mail-headers
      (nconc message-required-mail-headers
             (list '(X-Face . xface-insert)))
      message-required-news-headers
      (nconc message-required-news-headers
             (list '(X-Face . xface-insert)))

      gnus-confirm-mail-reply-to-news t ; Nachfrage bei (Mail-)Reply
					; auf News
      gnus-gcc-mark-as-read t ; archivierte Mails sollen als read
			      ; markiert werden

      gnus-posting-styles
      '((".*"
	 (signature-file "~/.signature"))
	("^de.alt.soc.punk"
	 (signature-file "~/.signature-dasp"))))

;; Message-ID setzen
(defun message-make-message-id ()
  (concat "<"(message-unique-id)"@sopos.org>"))

;;* Higher Scoring of followups to myself
(add-hook 'message-sent-hook 'gnus-score-followup-article)
(add-hook 'message-sent-hook 'gnus-score-followup-thread)


www.cacert.org
© 2006 Oliver Heins <olli@sopos.org>
GnuPG-Key: https://sopos.org/pgp/olli.asc
GnuPG-Fingerprint: F27A BA8C 1CFB B905 65A8 2544 0F07 B675 9A00 D827
Letzte Änderung dieser Seite: Samstag, 25. November 2006, 00:47.